Lấy cảm hứng từ @yarkee Tôi đã kết hợp nó với một số mã tôi đã có. Bạn cũng có thể gọi lệnh này từ một tập lệnh khác, chỉ bằng cách gọi hàm run_unit_tests()
mà không yêu cầu sử dụng dòng lệnh hoặc chỉ gọi nó từ dòng lệnh với python3 my_test_file.py
.
import my_test_file
my_test_file.run_unit_tests()
Đáng buồn thay, điều này chỉ làm việc cho Python 3.3
hoặc cấp trên:
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")
Mã người chạy:
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
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,
]
# Comment all the tests names on this list, to run all Unit Tests
unit_tests_to_run = [
"test_it_is_sunny",
# "test_it_is_hot",
]
runner.run( create_suite( classes, unit_tests_to_run ) )
if __name__ == "__main__":
print( "\n\n" )
run_unit_tests()
Chỉnh sửa mã một chút, bạn có thể vượt qua một mảng với tất cả các bài kiểm tra đơn vị bạn muốn gọi:
...
def run_unit_tests(unit_tests_to_run):
runner = unittest.TextTestRunner()
classes = \
[
LineBalancingUnitTests,
]
runner.run( suite( classes, unit_tests_to_run ) )
...
Và một tập tin khác:
import my_test_file
# Comment all the tests names on this list, to run all Unit Tests
unit_tests_to_run = \
[
"test_it_is_sunny",
# "test_it_is_hot",
]
my_test_file.run_unit_tests( unit_tests_to_run )
Ngoài ra, bạn có thể sử dụng https://docs.python.org/3/l Library / unittest.html # load-tests-protatio và xác định phương pháp sau trên mô-đun / tệp thử nghiệm của bạn:
def load_tests(loader, standard_tests, pattern):
suite = unittest.TestSuite()
# To add a single test from this file
suite.addTest( LineBalancingUnitTests( 'test_it_is_sunny' ) )
# To add a single test class from this file
suite.addTests( unittest.TestLoader().loadTestsFromTestCase( LineBalancingUnitTests ) )
return suite
Nếu bạn muốn giới hạn thực thi trong một tệp thử nghiệm duy nhất, bạn chỉ cần đặt mẫu khám phá thử nghiệm thành tệp duy nhất nơi bạn đã xác định load_tests()
hàm.
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
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() )
Người giới thiệu:
- Sự cố với sys.argv [1] khi mô-đun unittest nằm trong tập lệnh
- Có cách nào lặp lại và thực hiện tất cả các hàm trong một lớp Python không?
- lặp qua tất cả các biến thành viên của một lớp trong python
Ngoài ra, đến ví dụ chương trình chính cuối cùng, tôi đã đưa ra biến thể sau đây sau khi đọc unittest.main()
phương thức thực hiện:
- https://github.com/python/cpython/blob/master/Lib/unittest/main.py#L65
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
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() )