यदि आप परीक्षण के अंदर __init__.py
फ़ाइल जोड़ने के ठीक हैं, तो आप load_tests
फ़ंक्शन डाल सकते हैं जो आपके लिए खोज को संभालेगा।
परीक्षण पैकेज का नाम (__init__.py
साथ निर्देशिका) पैटर्न तो पैकेज एक 'load_tests' समारोह के लिए जाँच की जाएगी से मेल खाता है। यदि यह मौजूद है तो इसे लोडर, परीक्षण, पैटर्न के साथ बुलाया जाएगा।
load_tests तो मौजूद खोज पैकेज में नहीं recurse करता है, load_tests पैकेज में सभी परीक्षण लोड करने के लिए जिम्मेदार है।
मुझे विश्वास से दूर कर रहा हूँ कि यह सबसे अच्छा तरीका है, लेकिन एक ही रास्ता है कि समारोह में लिखने के लिए होगा:
import os
import pkgutil
import inspect
import unittest
# Add *all* subdirectories to this module's path
__path__ = [x[0] for x in os.walk(os.path.dirname(__file__))]
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for memname, memobj in inspect.getmembers(mod):
if inspect.isclass(memobj):
if issubclass(memobj, unittest.TestCase):
print("Found TestCase: {}".format(memobj))
for test in loader.loadTestsFromTestCase(memobj):
print(" Found Test: {}".format(test))
suite.addTest(test)
print("=" * 70)
return suite
सुंदर बदसूरत, मैं सहमत हूँ।
सबसे पहले आप सभी उपनिर्देशिका परीक्षण पैकेज के पथ (Docs) में जोड़ते हैं।
फिर, आप पथ पर चलने के लिए pkgutil
का उपयोग करते हैं, पैकेज या मॉड्यूल की तलाश करते हैं।
जब यह एक पाता है, तो यह मॉड्यूल सदस्यों को यह देखने के लिए जांचता है कि वे कक्षाएं हैं, और यदि वे कक्षाएं हैं, चाहे वे unittest.TestCase
के उप-वर्ग हैं। यदि वे हैं, कक्षाओं के अंदर परीक्षण परीक्षण सूट में लोड कर रहे हैं।
तो अब, अपनी परियोजना के रूट के अंदर से, आप
python -m unittest discover -p tests
टाइप -p
पैटर्न स्विच का उपयोग कर सकते हैं। सब कुछ ठीक है, तुम मैं क्या देखा देखेंगे, जो की तरह कुछ है:
Found TestCase: <class 'test_tc.TestCase'>
Found Test: testBar (test_tc.TestCase)
Found Test: testFoo (test_tc.TestCase)
Found TestCase: <class 'test_employee.TestCase'>
Found Test: testBar (test_employee.TestCase)
Found Test: testFoo (test_employee.TestCase)
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
है कौन क्या उम्मीद थी, मेरे दो उदाहरण फ़ाइलों में से प्रत्येक के दो टेस्ट, testFoo
और testBar
प्रत्येक निहित।
संपादित करें:
def load_tests(loader, suite, pattern):
for imp, modname, _ in pkgutil.walk_packages(__path__):
mod = imp.find_module(modname).load_module(modname)
for test in loader.loadTestsFromModule(mod):
print("Found Tests: {}".format(test._tests))
suite.addTests(test)
यह loader.loadTestsFromModule()
विधि के बजाय का उपयोग करता है loader.loadTestsFromTestCase()
विधि मैं ऊपर प्रयोग किया जाता है: कुछ और खुदाई के बाद, यह के रूप में की तरह आप इस समारोह निर्दिष्ट कर सकते हैं लग रहा है।यह अभी भी tests
पैकेज पथ को संशोधित करता है और इसे मॉड्यूल की तलाश में चलता है, जो मुझे लगता है कि यहां कुंजी है।
उत्पादन अब कुछ अलग दिखाई देता है, हम हमारे मुख्य testsuite suite
करने के लिए एक समय में एक पाया testsuite जोड़ रहे हैं के बाद से:
python -m unittest discover -p tests
Found Tests: [<test_tc.TestCase testMethod=testBar>, <test_tc.TestCase testMethod=testFoo>]
Found Tests: [<test_employee.TestCase testMethod=testBar>, <test_employee.TestCase testMethod=testFoo>]
======================================================================
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s
OK
लेकिन हम अभी भी 4 परीक्षण हम उम्मीद मिलता है, दोनों वर्गों में, दोनों उपनिर्देशिकाओं में।
क्या आपने उदा। http://stackoverflow.com/q/644821/3001761? मुझे लगता है कि उनमें से कुछ उत्तरों को आपके उद्देश्यों के लिए अनुकूलित किया जा सकता है। – jonrsharpe