U e&@sdZdZddlZddlZddlmZddlmZmZzddl m Z m Z Wn$e k rlddl m Z m Z YnXe eZGdddeZdS) a This plugin adds a test id (like #1) to each test name output. After you've run once to generate test ids, you can re-run individual tests by activating the plugin and passing the ids (with or without the # prefix) instead of test names. For example, if your normal test run looks like:: % nosetests -v tests.test_a ... ok tests.test_b ... ok tests.test_c ... ok When adding ``--with-id`` you'll see:: % nosetests -v --with-id #1 tests.test_a ... ok #2 tests.test_b ... ok #3 tests.test_c ... ok Then you can re-run individual tests by supplying just an id number:: % nosetests -v --with-id 2 #2 tests.test_b ... ok You can also pass multiple id numbers:: % nosetests -v --with-id 2 3 #2 tests.test_b ... ok #3 tests.test_c ... ok Since most shells consider '#' a special character, you can leave it out when specifying a test id. Note that when run without the -v switch, no special output is displayed, but the ids file is still written. Looping over failed tests ------------------------- This plugin also adds a mode that will direct the test runner to record failed tests. Subsequent test runs will then run only the tests that failed last time. Activate this mode with the ``--failed`` switch:: % nosetests -v --failed #1 test.test_a ... ok #2 test.test_b ... ERROR #3 test.test_c ... FAILED #4 test.test_d ... ok On the second run, only tests #2 and #3 will run:: % nosetests -v --failed #2 test.test_b ... ERROR #3 test.test_c ... FAILED As you correct errors and tests pass, they'll drop out of subsequent runs. First:: % nosetests -v --failed #2 test.test_b ... ok #3 test.test_c ... FAILED Second:: % nosetests -v --failed #3 test.test_c ... FAILED When all tests pass, the full set will run on the next invocation. First:: % nosetests -v --failed #3 test.test_c ... ok Second:: % nosetests -v --failed #1 test.test_a ... ok #2 test.test_b ... ok #3 test.test_c ... ok #4 test.test_d ... ok .. note :: If you expect to use ``--failed`` regularly, it's a good idea to always run using the ``--with-id`` option. This will ensure that an id file is always created, allowing you to add ``--failed`` to the command line as soon as you have failing tests. Otherwise, your first run using ``--failed`` will (perhaps surprisingly) run *all* tests, because there won't be an id file containing the record of failed tests from your previous run. FN)Plugin)srcset)dumploadc@sreZdZdZdZdZdZdZddZdd Z d d Z dd d Z ddZ ddZ ddZddZddZddZdS)TestIdz Activate to add a test id (like #1) to each test name output. Activate with --failed to rerun failing tests only. idNTFcCs<t||||jddddddd|jdd d d d d dS)z&Register commandline options. z --id-filestore testIdFilez.noseidsFILEzfStore test ids found in test runs in this file. Default is the file .noseids in the working directory.)actiondestdefaultmetavarhelpz--failed store_truefailedFz/Run the tests that failed in the last test run.)r r rrN)roptions add_option)selfparserenvrA/opt/hc_python/lib/python3.8/site-packages/nose/plugins/testid.pyrxs zTestId.optionscCst||||jr*d|_d|_tdtj |j |_ tj |j s\tj |j|j |_ d|_i|_i|_g|_g|_i|_|jdk|_dS)zConfigure plugin. TzLooping on failed testsN)r configurerenabled loopOnFailedlogdebugospath expanduserr idfileisabsjoinZ workingDirridstests source_names_seen verbosity _write_hashes)rrconfrrrrs zTestId.configurecCs|rg|_|jrsz-TestId.loadTestsFromNames..z&translated: %s new sources %s names %s)rr r5r$rr'rr)maxrr0r1r2r3r4r(r6 ValueErrorstrIOErrorrr/trappendrextend) rnamesmoduler8dataeZ translatedZ new_sourceZ really_newnameZtransZnew_setrr=rloadTestsFromNamessp    * $     zTestId.loadTestsFromNamescCsDtd||\}}}|dk r(t|}n|}|dk r@d||fS|S)Nz Make name %sz%s:%s)rr r)raddrfilenamerGcallheadrrrmakeNames    zTestId.makeNamecCs ||_dS)zBGet handle on output stream so the plugin can print id #s N)stream)rrQrrrsetOutputStreamszTestId.setOutputStreamcCs|}td|||jk||jkr^||jkr<|dn|d|j|d|j|<dS|j|j|<|d|j|jd7_dS)zMaybe output an id # before the test name. Example output:: #1 test.test ... ok #2 test.test_two ... ok zstart test %s (%s)z z#%s rN)addressrr r(r*writer)rtestZadrrrr startTests      zTestId.startTestcCsP|jdkrLzt|j|}Wntk r4YnX||jkrL|j|dS)NF)ZpassedrAr(rSKeyErrorrrD)rrUkeyrrr afterTests  zTestId.afterTestcCsdtd|zt|dd}Wntk r8|YSXtd|||jkr`||j|S|S)Nztr '%s'#z Got key %s)rr intreplacer@r'rP)rrJrXrrrrC(s    z TestId.trcCs|jr|j|dS)N)r,rQrT)routputrrrrT5sz TestId.write)N)__name__ __module__ __qualname____doc__rJr$r/rrrr9rKrPrRrVrYrCrTrrrrrns H   r)rbZ__test__loggingr!Z nose.pluginsrZ nose.utilrrpicklerr ImportError getLoggerr_rrrrrrs^