开发者

Bootstrapping tests and using Python test discovery

A problem I continue to have it "bootstrapping" my tests.

The problem that I have is exactly what this guy has.

The top solution talks about creating a "boostrap" script. I presume that I must then enumerate all of the tests to be run, or use test manifests in the __init__.py files using the __all__ keyword. However, I noticed that the most recent Python documentation on unittest does not talk about __all__ anymore.

In 2.7, we have the python command called "discovery"

python -m unittest discover

That works even nicer. Because: 1) There's no need for Nose 2) There's no need for test manifests

But it doesn't seem to have a way to "bootstrap"

Do I need to use another test runner? One that allows bootstrapping AND discovery?

Do I need py.test?

http://pytest.org/

The reason that I need bootstrapping, is the problem that this guy has. Basically, my import statements don't work right if I run the test directly. I want to execute my suite of tests from the top of my project, just like the app would when it runs normally.

After all, import statements are always relative to their physical location. (BTW, I think this is a hindrance in Python)

Definition: What is Bootstrapping? Bootstrapping means that I want to do some setup before running any tests at all in the entire project. This is sort of like me asking for a "test setup" at the whole project level.

Update Here is another posting about the same thing. Using this 2.7 command, we can avoid Nose. But h开发者_高级运维ow does one add bootstrapping?


I got it!

Using this one script that I wrote and called it "runtests.py" and placed in my project root, I was able to "bootstrap" that is to run some initialization code AND use discovery. Woot!

In my case, the "bootstrap" code is the two lines that say:

import sys
sys.path.insert(0, 'lib.zip')

Thanks!

#!/usr/bin/python

import unittest
import sys
sys.path.insert(0, 'lib.zip')

if __name__ == "__main__":
    all_tests = unittest.TestLoader().discover('.')
    unittest.TextTestRunner().run(all_tests)


Here's what I do, and I think it works quite well. For a file/directory structure similar to this:

main_code.py
run_tests.py
    /Modules
        __init__.py
        some_module1.py
        some_module2.py
    /Tests
        __init__.py
        test_module1.py
        test_module2.py

It's fairly easy to organize your run_tests.py file to bootstrap the tests. First every file with test (test_module1.py, etc.) should implement a function that generates a test suite. Something like:

def suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(Test_Length))
    suite.addTest(unittest.makeSuite(Test_Sum))
    return suite

at the end of your test code. Then, in the run_tests.py file, you aggregate these into an additional test_suite, and run that:

import unittest
import Tests.test_module1 as test_module1
import Tests.test_module2 as test_module2

module1_test_suite = test_module1.suite()
module2_test_suite = test_module2.suite()

aggregate_suite = unittest.TestSuite()
aggregate_suite.addTest(module1_test_suite)
aggregate_suite.addTest(module2_test_suite)

unittest.TextTestsRunner(verbosity = 2).run(aggregate_suite

Then to run all of these tests, from the command line, simply run

python run_tests.py
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜