受yarkee的启发,我将其与我已有的一些代码结合起来。您还可以从另一个脚本中调用它,只需调用函数run_unit_tests()
,无需使用命令行,或者通过命令行调用python3 my_test_file.py
。
import my_test_file
my_test_file.run_unit_tests()
遗憾的是,这仅适用于Python 3.3或以上版本:
import unittest
class LineBalancingUnitTests(unittest.TestCase):
@classmethod
def setUp(self):
self.maxDiff = None
def test_it_is_sunny(self):
self.assertTrue("a" == "a")
def test_it_is_hot(self):
self.assertTrue("a" != "b")
跑步者代码:
import unittest
from .somewhere import LineBalancingUnitTests
def create_suite(classes, unit_tests_to_run):
suite = unittest.TestSuite()
unit_tests_to_run_count = len( unit_tests_to_run )
for _class in classes:
_object = _class()
for function_name in dir( _object ):
if function_name.lower().startswith( "test" ):
if unit_tests_to_run_count > 0 \
and function_name not in unit_tests_to_run:
continue
suite.addTest( _class( function_name ) )
return suite
def run_unit_tests():
runner = unittest.TextTestRunner()
classes = [
LineBalancingUnitTests,
]
unit_tests_to_run = [
"test_it_is_sunny",
]
runner.run( create_suite( classes, unit_tests_to_run ) )
if __name__ == "__main__":
print( "\n\n" )
run_unit_tests()
编辑代码,稍作修改,您可以传递一个包含所有要调用的单元测试的数组:
...
def run_unit_tests(unit_tests_to_run):
runner = unittest.TextTestRunner()
classes = \
[
LineBalancingUnitTests,
]
runner.run( suite( classes, unit_tests_to_run ) )
...
还有另一个文件:
import my_test_file
unit_tests_to_run = \
[
"test_it_is_sunny",
]
my_test_file.run_unit_tests( unit_tests_to_run )
或者,你可以使用 load_tests Protocol 并在测试模块/文件中定义以下方法:
def load_tests(loader, standard_tests, pattern):
suite = unittest.TestSuite()
suite.addTest( LineBalancingUnitTests( 'test_it_is_sunny' ) )
suite.addTests( unittest.TestLoader().loadTestsFromTestCase( LineBalancingUnitTests ) )
return suite
如果您想将执行限制为单个测试文件,则只需将测试发现模式设置为仅包含定义了load_tests()
函数的文件。
import os
import sys
import unittest
test_pattern = 'mytest/module/name.py'
PACKAGE_ROOT_DIRECTORY = os.path.dirname( os.path.realpath( __file__ ) )
loader = unittest.TestLoader()
start_dir = os.path.join( PACKAGE_ROOT_DIRECTORY, 'testing' )
suite = loader.discover( start_dir, test_pattern )
runner = unittest.TextTestRunner( verbosity=2 )
results = runner.run( suite )
print( "results: %s" % results )
print( "results.wasSuccessful: %s" % results.wasSuccessful() )
sys.exit( not results.wasSuccessful() )
参考资料:
- 当unittest模块在脚本中时,sys.argv[1]存在问题
- 有没有一种方法可以循环执行Python类中的所有函数?
- 在Python中循环遍历类的所有成员变量
除了上一个主程序示例外,我在阅读unittest.main()
方法实现后想到了以下变化:
- https://github.com/python/cpython/blob/master/Lib/unittest/main.py#L65
import os
import sys
import unittest
PACKAGE_ROOT_DIRECTORY = os.path.dirname( os.path.realpath( __file__ ) )
start_dir = os.path.join( PACKAGE_ROOT_DIRECTORY, 'testing' )
from testing_package import main_unit_tests_module
testNames = ["TestCaseClassName.test_nameHelloWorld"]
loader = unittest.TestLoader()
suite = loader.loadTestsFromNames( testNames, main_unit_tests_module )
runner = unittest.TextTestRunner(verbosity=2)
results = runner.run( suite )
print( "results: %s" % results )
print( "results.wasSuccessful: %s" % results.wasSuccessful() )
sys.exit( not results.wasSuccessful() )
__init__.py
并调用例如python test/testMyCase.py test.MyCase.testItIsHot
来完成它。 - Alois Mahdal