这是我的设置 -
project/
__init__.py
prog.py
test/
__init__.py
test_prog.py
我希望能够通过在prog.py中调用命令行选项来运行我的单元测试,这样当我部署项目时,我可以随时部署运行单元测试的能力。
python prog.py --unittest
在prog.py或我的项目的其余部分中我需要什么才能工作?
也许this是你正在寻找的。在load_tests
中实现test_prog.py
函数,并在prog.py
中使用以下代码来加载和运行测试:
import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
Python unittest
模块包含自己的test discovery函数,您可以从命令行运行该函数:
$ python -m unittest discover
要从模块中运行此命令,可以使用subprocess
模块:
#!/usr/bin/env python
import sys
import subprocess
# ...
# the rest of your module's code
# ...
if __name__ == '__main__':
if '--unittest' in sys.argv:
subprocess.call([sys.executable, '-m', 'unittest', 'discover'])
如果您的模块有其他命令行选项,您可能需要查看argparse
以获取更多高级选项。
您必须确保始终遵循某些命名约定(您似乎正在执行此操作):
test_
是标准),然后是您要测试的模块的名称。
prog.py
=> test_prog.py
test/
目录中。然后你可以做这样的事情:
import sys
...
... do module stuff here...
...
if __name__ == "__main__":
# Check if we want to run the tests for this file
if "--unittest" in sys.argv:
import unittest
test_filename = 'test_' + __file__
test_directory = 'test'
suite = unittest.TestLoader().discover(test_directory, pattern=test_filename)
unittest.TextTestRunner(verbosity=2).run(suite)
我们正在做的是:
--unittest
(因为这是您唯一要运行测试的时间)。test_prog.py
- 遵循我们设置的命名约定。TestLoader().discover
函数。
discover(...)从指定的目录开始,找到与提供的模式匹配的所有测试模块(递归到子目录)。
在我们的例子中,它将在test/
目录中查找名为test_prog.py
的任何模块。如果是这样,它会加载它并使用我们想要运行的TestCases创建一个TestSuite。unittest
以运行上一步中获得的suite
。通常情况下,unittest
将在后台为我们完成所有这些工作,但由于我们正在尝试运行特定的测试模块,因此我们必须准确地告诉我们如何以及从何处获取它。
另请注意,您必须为要执行此操作的每个文件执行此操作。