Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to load resource file while running python unittest using twisted trial

Problem

As part of python unittest, some input json files are to be loaded which exists under 'data' directory which resides in the same directory of test py file.

'pkg_resources' is used for this purpose.

It works fine when the unittest are running with python. But it fails when running with twisted trial.

My project has mixed testcases with both python unittest testcases as well as twisted.trial.unittest testcases. so, there is a need to run both type of testcases with twisted trial in general.

The '_trial_temp' directory is added in path when running testcases with twisted trial. please, let me know there is any way to handle this?

Example directory structure:

myproject/
└── tests
    ├── data
    │   └── input.json
    ├── trialTest.py

trialTest.py

import unittest
import inspect
import pkg_resources

class Test(unittest.TestCase):
    def test_01_pathTest(self):
        dataDirExists =     pkg_resources.resource_exists(inspect.getmodule(self).__name__, 'data')
        print 'data exists: %s' % (dataDirExists)

if __name__ == '__main__':
    unittest.main()

Running test using python and its output:

cd myproject
python tests/trialTest.py
data exists: True
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Running test using python and its output:

cd myproject
/usr/local/bin/trial tests/trialTest.py
trialTest
  Test
    test_01_pathTest ... data exists: False
                                                  [OK]

-------------------------------------------------------------------------------
Ran 1 tests in 0.013s

PASSED (successes=1)
like image 810
Durai Bose Avatar asked Oct 19 '22 15:10

Durai Bose


1 Answers

In the first example, __name__ will be set to __main__, and the tests directory will be automatically added to sys.path. This works more or less by accident; if you move your unittest.main invocation to another module, you won't be able to import it quite the same way, and data may not show up.

In the second example, trial will, depending on the presence of an __init__.py file in the tests directory, set __name__ to either trialTest or tests.trialTest; or perhaps even myproject.tests.trialTest.

You should re-name the module to test_trialtest.py so that it is discovered by trial's module-walking code properly, and then invoke it with a module name rather than a file name. This means you should have a clear idea of what myproject/tests/test_trialtest.py's module name is supposed to be. Is myproject supposed to be on sys.path? The parent directory?

Basically, pkg_resources depends intimately on the details of the namespaces into which code is loaded and executed, so you need to be careful that everything is set up consistently. If you make sure that everything is imported the same way, under the same name (never as __main__, for example) then this should be totally consistent between trial and stdlib unittest; there's nothing really special about trial here except that you are running it (trial itself)` as the main script rather than your test script as the main script.

like image 182
Glyph Avatar answered Oct 22 '22 07:10

Glyph