@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")
धावक कोड:
#! /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()
कोड को थोड़ा संपादित करते हुए, आप सभी इकाई परीक्षणों के साथ एक सरणी पास कर सकते हैं जिसे आप कॉल करना चाहते हैं:
...
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
# 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 )
वैकल्पिक रूप से, आप https://docs.python.org/3/library/unittest.html#load-tests-protocol का उपयोग कर सकते हैं और अपने परीक्षण मॉड्यूल / फ़ाइल पर निम्न विधि को परिभाषित कर सकते हैं :
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
यदि आप निष्पादन को एक एकल परीक्षण फ़ाइल तक सीमित करना चाहते हैं, तो आपको परीक्षण खोज पैटर्न को केवल उस फ़ाइल पर सेट करने की आवश्यकता है जहां आपने load_tests()
फ़ंक्शन को परिभाषित किया है।
#! /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() )
संदर्भ:
- जब स्क्रिप्ट में unittest मॉड्यूल होता है, तो sys.argv [1] के साथ समस्या
- क्या पायथन क्लास में सभी कार्यों को पूरा करने और निष्पादित करने का एक तरीका है?
- अजगर में एक वर्ग के सभी सदस्य चर पर पाशन
वैकल्पिक रूप से अंतिम मुख्य कार्यक्रम उदाहरण के लिए, मैं unittest.main()
विधि के कार्यान्वयन को पढ़ने के बाद निम्नलिखित बदलाव के साथ आया :
- 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() )