আমি কীভাবে একটি ডিরেক্টরিতে সমস্ত পাইথন ইউনিট পরীক্ষা চালাতে পারি?


315

আমার একটি ডিরেক্টরি রয়েছে যাতে আমার পাইথন ইউনিট পরীক্ষা রয়েছে। প্রতিটি ইউনিট পরীক্ষা মডিউল ফর্ম পরীক্ষা _ *। পিআই এর হয় । আমি All_test.py নামে একটি ফাইল তৈরি করার চেষ্টা করছি যা আপনি এটি অনুমান করেছিলেন, উল্লিখিত পরীক্ষার ফর্মটিতে সমস্ত ফাইল চালান এবং ফলাফলটি ফিরে আসবেন। আমি এ পর্যন্ত দুটি পদ্ধতি চেষ্টা করেছি; উভয়ই ব্যর্থ হয়েছে। আমি দুটি পদ্ধতি দেখাব এবং আমি আশা করি যে কেউ কেউ বাস্তবে এটি কীভাবে সঠিকভাবে করতে হয় তা জানে।

আমার প্রথম সাহসী প্রচেষ্টার জন্য, আমি ভেবেছিলাম "আমি যদি কেবলমাত্র ফাইলটিতে আমার সমস্ত পরীক্ষার মডিউলগুলি আমদানি করি এবং এই unittest.main()ডুডাডকে কল করি, এটি ঠিক কাজ করবে?" ঠিক আছে, দেখা যাচ্ছে আমি ভুল ছিলাম।

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]

if __name__ == "__main__":
     unittest.main()

এটি কার্যকর হয়নি, ফলাফল আমি পেয়েছি:

$ python all_test.py 

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

আমার দ্বিতীয়বার চেষ্টা করার জন্য, যদিও আমি ঠিক আছি, সম্ভবত আমি আরও "ম্যানুয়াল" ফ্যাশনে এই পুরো পরীক্ষার জিনিসটি করার চেষ্টা করব। সুতরাং আমি নীচে তা করার চেষ্টা করেছি:

import glob
import unittest

testSuite = unittest.TestSuite()
test_file_strings = glob.glob('test_*.py')
module_strings = [str[0:len(str)-3] for str in test_file_strings]
[__import__(str) for str in module_strings]
suites = [unittest.TestLoader().loadTestsFromName(str) for str in module_strings]
[testSuite.addTest(suite) for suite in suites]
print testSuite 

result = unittest.TestResult()
testSuite.run(result)
print result

#Ok, at this point I have a result
#How do I display it as the normal unit test command line output?
if __name__ == "__main__":
    unittest.main()

এটিও কাজ করেনি, তবে এটি এত কাছে বলে মনে হচ্ছে!

$ python all_test.py 
<unittest.TestSuite tests=[<unittest.TestSuite tests=[<unittest.TestSuite tests=[<test_main.TestMain testMethod=test_respondes_to_get>]>]>]>
<unittest.TestResult run=1 errors=0 failures=0>

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

আমার মনে হয় কোনও ধরণের স্যুট রয়েছে এবং আমি ফলাফলটি কার্যকর করতে পারি। আমি এই সম্পর্কে একটু উদ্বিগ্ন যে এটি বলে যে আমার কেবল আছে run=1, মনে হয় এটি হওয়া উচিত run=2, তবে এটি অগ্রগতি। তবে আমি কীভাবে পাস করব এবং ফলাফলটি প্রধানতে প্রদর্শিত করব? বা আমি কীভাবে এটি প্রাথমিকভাবে কাজ করব যাতে আমি কেবল এই ফাইলটি চালাতে পারি, এবং এরকমভাবে এই ডিরেক্টরিতে সমস্ত ইউনিট পরীক্ষা চালাতে পারি?


1
আপনি যদি পাইথন ২.7++ ব্যবহার করেন তবে ট্র্যাভিসের জবাবটি ছেড়ে যান
রকি

আপনি কি কখনও পরীক্ষা উদাহরণের বস্তু থেকে পরীক্ষা চালানোর চেষ্টা করেছিলেন?
পিনোকিও

একটি উদাহরণ ফাইল কাঠামো সহ একটি সমাধানের জন্য এই উত্তরটি দেখুন ।
ডেরেক সোইক

উত্তর:


477

পাইথন ২.7 এবং উচ্চতর সহ আপনাকে নতুন কোড লিখতে হবে না বা এটি করতে তৃতীয় পক্ষের সরঞ্জাম ব্যবহার করতে হবে না; কমান্ড লাইনের মাধ্যমে পুনরাবৃত্তির পরীক্ষা সম্পাদনটি অন্তর্নির্মিত। __init__.pyআপনার পরীক্ষা ডিরেক্টরিতে একটি রাখুন এবং:

python -m unittest discover <test_directory>
# or
python -m unittest discover -s <directory> -p '*_test.py'

পাইথন ২.7 বা পাইথন ৩.x ইউনিটেস্ট ডকুমেন্টেশনে আপনি আরও পড়তে পারেন ।


11
সমস্যার মধ্যে রয়েছে: ImportError: স্টার্ট ডিরেক্টরির আমদানিযোগ্য নয়:
zinking

6
কমপক্ষে লিনাক্সে পাইথন ২.7.৮ এর সাথে কমান্ড লাইনের অনুরোধই আমাকে পুনরাবৃত্তি দেয় না। আমার প্রকল্পে বেশ কয়েকটি সাব-প্রকল্প রয়েছে যার ইউনিট পরীক্ষা সংশ্লিষ্ট "ইউনিট_সেটস / <সাবপ্রজেক্ট> / পাইথন /" ডিরেক্টরিতে বাস করে। যদি আমি এই জাতীয় পথটি নির্দিষ্ট করি তবে সেই সাবপ্রজেক্টের জন্য ইউনিট পরীক্ষাগুলি চালিত হয় তবে পরীক্ষার ডিরেক্টরি আর্গুমেন্ট হিসাবে কেবল "ইউনিট_সেটস" দিয়ে কোনও পরীক্ষা পাওয়া যায় না (সমস্ত সাবজেক্ট্রের জন্য সমস্ত পরীক্ষার পরিবর্তে, যেমনটি আমি আশা করি)। কোন ইঙ্গিত?
ব্যবহারকারী 686249

6
পুনরাবৃত্তির বিষয়ে: <টেস্ট-ডিরেক্টরী> ছাড়াই প্রথম কমান্ড ডিফল্ট "।" এবং recurses submodules । অর্থাৎ, আপনি যে সমস্ত পরীক্ষা ডিরেক্টরি আবিষ্কার করেছেন তার একটি init .py থাকা দরকার। যদি তারা তা করে, তারা আবিষ্কার কমান্ডের সাহায্যে পাওয়া যাবে। শুধু এটি চেষ্টা করে, এটি কাজ করে।
এমিল স্টেনস্ট্রোম

এটি আমার পক্ষে কাজ করেছে। আমার চারটি ফাইল সহ একটি পরীক্ষার ফোল্ডার রয়েছে, এটি আমার লিনাক্স টার্মিনাল, দুর্দান্ত স্টাফ থেকে চালান।
জেসটোনাচায়ার

5
ধন্যবাদ! কেন এটি গৃহীত উত্তর নয়? আমার দৃষ্টিতে, সর্বোত্তম উত্তরটি সর্বদা এমন হয় যা কোনও বাহ্যিক নির্ভরতার প্রয়োজন হয় না ...
জোনাথন বেন

108

আপনি কোনও পরীক্ষার রানার ব্যবহার করতে পারেন যা এটি আপনার জন্য করবে। উদাহরণস্বরূপ নাক খুব ভাল। চালানো হলে এটি বর্তমান গাছের পরীক্ষা করে এটি চালায়।

আপডেট করা হয়েছে:

আমার প্রাক-নাকের দিনগুলি থেকে এখানে কিছু কোড। আপনি সম্ভবত মডিউল নামের সুস্পষ্ট তালিকাটি চান না, তবে সম্ভবত বাকীটি আপনার কাজে আসবে।

testmodules = [
    'cogapp.test_makefiles',
    'cogapp.test_whiteutils',
    'cogapp.test_cogapp',
    ]

suite = unittest.TestSuite()

for t in testmodules:
    try:
        # If the module defines a suite() function, call it to get the suite.
        mod = __import__(t, globals(), locals(), ['suite'])
        suitefn = getattr(mod, 'suite')
        suite.addTest(suitefn())
    except (ImportError, AttributeError):
        # else, just load all the test cases from the module.
        suite.addTest(unittest.defaultTestLoader.loadTestsFromName(t))

unittest.TextTestRunner().run(suite)

2
এই পদ্ধতির সুবিধা কি কেবলমাত্র আপনার পরীক্ষার সমস্ত মডিউলগুলি একটি টেস্ট_ল.পি মডিউলটিতে স্পষ্টভাবে আমদানি করে এবং ইউনিটেস্ট.মেইন () কল করা যায় যা আপনি কিছু মডিউলে একটি পরীক্ষার স্যুইট অন্যথায় নয়?
কোরি পোর্টার

1
আমি নাক চেষ্টা করেছিলাম এবং এটি পুরোপুরি কার্যকর হয়। আমার প্রকল্পে এটি ইনস্টল করা এবং চালানো সহজ ছিল। এমনকি আমি এটি ভার্চুয়ালেনভের অভ্যন্তরে কয়েক লাইনের স্ক্রিপ্ট দিয়ে স্বয়ংক্রিয় করতে সক্ষম হয়েছি। নাকের জন্য +1!
জেসি ওয়েব

সর্বদা কার্যকর নয়: কখনও কখনও প্রকল্পের আমদানি কাঠামোটি মডিউলগুলিতে আমদানি চালানোর চেষ্টা করলে নাক বিভ্রান্ত হতে পারে।
চিফা

4
লক্ষ্য করুন নাক "গত কয়েক বছর ধরে রক্ষণাবেক্ষণ মোডে" হয়েছে এবং এটি বর্তমানে ব্যবহৃত করার পরামর্শ দেওয়া হয় nose2 , pytest , বা শুধু প্লেইন unittest / unittest2 নতুন প্রকল্পের জন্য।
কুর্ট পিক

আপনি কি কখনও পরীক্ষা উদাহরণের বস্তু থেকে পরীক্ষা চালানোর চেষ্টা করেছিলেন?
পিনোকিও

95

অজগর 3 এ, আপনি যদি ব্যবহার করছেন unittest.TestCase:

  • __init__.pyআপনার নিজের testডিরেক্টরিতে একটি ফাঁকা (বা অন্যথায়) ফাইল থাকতে হবে ( অবশ্যই নামকরণ করা উচিতtest/ )
  • আপনার পরীক্ষার ফাইলগুলি অভ্যন্তরের সাথে test/মেলে test_*.py। এগুলির অধীনে একটি উপ-ডিরেক্টরিতে থাকতে পারে test/এবং সেই সাবডিয়ারদের যে কোনও কিছু হিসাবে নাম দেওয়া যেতে পারে।

তারপরে, আপনি এর সাথে সমস্ত পরীক্ষা চালাতে পারেন:

python -m unittest

সম্পন্ন! 100 লাইনের চেয়ে কম সমাধান। আশা করি অন্য পাইথন শিক্ষানবিস এটি সন্ধান করে সময় বাঁচায়।


3
নোট করুন যে ডিফল্টরূপে এটি কেবলমাত্র "টেস্ট" দিয়ে ফাইল ফাইলগুলির পরীক্ষার জন্য অনুসন্ধান করে
শাবাবাওয়া

3
এটি সঠিক, মূল প্রশ্নটি এই সত্যটিকে উল্লেখ করে যে "প্রতিটি ইউনিট পরীক্ষা মডিউলটি ফর্ম পরীক্ষার _ _। পাই।", তাই প্রত্যক্ষ উত্তরে এই উত্তরটি। আমি এখন উত্তরটি আরও সুস্পষ্ট হওয়ার জন্য আপডেট করেছি
tmck-code

1
ধন্যবাদ, ট্র্যাভিস বিয়ারের উত্তরটি ব্যবহার করার জন্য যা আমার অনুপস্থিত ছিল।
জেরেমি কোচয়

65

এটি এখন ইউনিটেস্ট থেকে সরাসরি সম্ভব: ইউনিটেস্টেস্ট.টেষ্টলোডার.ডিসকভার

import unittest
loader = unittest.TestLoader()
start_dir = 'path/to/your/test/files'
suite = loader.discover(start_dir)

runner = unittest.TextTestRunner()
runner.run(suite)

3
আমি এই পদ্ধতিটিও চেষ্টা করেছি, দুটি পরীক্ষা করেছি, তবে পুরোপুরি কাজ করে। চমৎকার !!! তবে আমি কৌতুহলী আমার মাত্র 4 টি পরীক্ষা আছে। তারা একসাথে 0.032s চালায় তবে আমি যখন এই সমস্তটি চালানোর জন্য এই পদ্ধতিটি ব্যবহার করি, তখন আমি ফলাফল পাব .... ---------------------------------------------------------------------- Ran 4 tests in 0.000s OKকেন? পার্থক্য, কোথা থেকে এসেছে?
সিম্কাস

কমান্ড লাইন থেকে এমন দেখতে একটি ফাইল চালাতে আমার সমস্যা হচ্ছে। কীভাবে এটি চাওয়া উচিত?
ডাস্টিন মিশেলস

python file.py
জবাই 9

1
নির্দোষভাবে কাজ করেছেন! এটি কেবল আপনার পরীক্ষায় / ডিয়ারে সেট করুন এবং তারপরে start_id = "./" সেট করুন। আইএমএইচও, এই উত্তরটি এখন (পাইথন ৩.7) স্বীকৃত উপায়!
jjwdesign

আপনি শেষ লাইনটি ´res = runner.run (স্যুট) এ পরিবর্তন করতে পারেন; sys.exit (0 হলে res.wasSuccessful () অন্য 1) ´ আপনি যদি সঠিক প্রস্থান কোড চান
সাদাপ

32

ঠিক আছে কিছু উপরে কোড অধ্যয়ন করে (বিশেষত ব্যবহার TextTestRunnerএবং defaultTestLoader), আমি বেশ কাছাকাছি পেতে সক্ষম হয়েছি। অবশেষে আমি আমার কোড ঠিক করেছিলাম কেবলমাত্র সমস্ত টেস্ট স্যুইটগুলিকে "ম্যানুয়ালি" যুক্ত করার পরিবর্তে কেবলমাত্র একটি একক স্যুইট কনস্ট্রাক্টরের কাছে পাস করে, যা আমার অন্যান্য সমস্যাগুলি স্থির করে। সুতরাং এখানে আমার সমাধান।

import glob
import unittest

test_files = glob.glob('test_*.py')
module_strings = [test_file[0:len(test_file)-3] for test_file in test_files]
suites = [unittest.defaultTestLoader.loadTestsFromName(test_file) for test_file in module_strings]
test_suite = unittest.TestSuite(suites)
test_runner = unittest.TextTestRunner().run(test_suite)

হ্যাঁ, এটি করার চেয়ে কেবল নাক ব্যবহার করা সম্ভবত সহজ, তবে এটি বিষয়টির বাইরেও।


ভাল, এটি বর্তমান ডিরেক্টরিটির জন্য সূক্ষ্মভাবে কাজ করে, কীভাবে উপ-সরাসরি ডাকে?
ল্যারি ক্যা

ল্যারি, পুনরাবৃত্তির পরীক্ষার আবিষ্কারের জন্য নতুন উত্তরটি ( স্ট্যাকওভারফ্লো.com / a / 24562019 / 104143 ) দেখুন
পিটার কোফার

আপনি কি কখনও পরীক্ষা উদাহরণের বস্তু থেকে পরীক্ষা চালানোর চেষ্টা করেছিলেন?
পিনোচিও

25

আপনি যদি বিভিন্ন পরীক্ষার কেস ক্লাস থেকে সমস্ত পরীক্ষা চালাতে চান এবং আপনি তাদের সুস্পষ্টভাবে নির্দিষ্ট করে বলতে পেরে খুশি হন তবে আপনি এটি এটি করতে পারেন:

from unittest import TestLoader, TextTestRunner, TestSuite
from uclid.test.test_symbols import TestSymbols
from uclid.test.test_patterns import TestPatterns

if __name__ == "__main__":

    loader = TestLoader()
    tests = [
        loader.loadTestsFromTestCase(test)
        for test in (TestSymbols, TestPatterns)
    ]
    suite = TestSuite(tests)

    runner = TextTestRunner(verbosity=2)
    runner.run(suite)

uclidআমার প্রকল্পটি কোথায় TestSymbolsএবং TestPatternsএর সাবক্লাস রয়েছে TestCase


থেকে unittest.TestLoader ডক্স : "সাধারণত এটি ক্লাসের একটা নিদর্শন তৈরি করতে কোন প্রয়োজন নেই; unittest মডিউল একটি দৃষ্টান্ত যে unittest.defaultTestLoader যেমন ভাগ করা যেতে পারে প্রদান করে।" এছাড়াও যেহেতু TestSuiteএকটি পুনরাবৃত্তিযোগ্যটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে , আপনি পুনরাবৃত্তি এড়াতে একটি লুপে পুনরাবৃত্তিযোগ্য বলে তৈরি করতে পারেন loader.loadTestsFromTestCase
টু-বিট অ্যালকেমিস্ট

@ টু-বিট অ্যালকেমিস্ট বিশেষত আপনার দ্বিতীয় পয়েন্টটি দুর্দান্ত। আমি কোডটি অন্তর্ভুক্ত করার জন্য পরিবর্তন করব তবে আমি এটি পরীক্ষা করতে পারছি না। (প্রথম মোড এটিকে আমার পছন্দ অনুসারে জাভার মতো দেখতে খুব সুন্দর করে তুলবে .. যদিও আমি বুঝতে পারি যে আমি যুক্তিবাদী হচ্ছি (তাদের একটি উটের ক্ষেত্রে পরিবর্তনশীল নামগুলি স্ক্রু করুন))।
12:56

এটি আমার পছন্দসই, খুব পরিষ্কার। এটি প্যাকেজ করতে সক্ষম হয়েছিল এবং এটি আমার নিয়মিত কমান্ড লাইনে একটি আর্গুমেন্ট তৈরি করতে সক্ষম হয়েছিল।
MarkII

15

কোডটি একটি (ন্যূনতম, আমার মনে হয়) নম্বর লাইনে এই ফলাফলটি অর্জনের জন্য আমি discoverপদ্ধতি এবং একটি ওভারলোডিং ব্যবহার করেছি load_tests:

def load_tests(loader, tests, pattern):
''' Discover and load all unit tests in all files named ``*_test.py`` in ``./src/``
'''
    suite = TestSuite()
    for all_test_suite in unittest.defaultTestLoader.discover('src', pattern='*_tests.py'):
        for test_suite in all_test_suite:
            suite.addTests(test_suite)
    return suite

if __name__ == '__main__':
    unittest.main()

ফাইভসে মৃত্যুদণ্ড কার্যকর করার মতো কিছু

Ran 27 tests in 0.187s
OK

এটি কেবল পাইথন 2.7 এর জন্য উপলব্ধ, আমার ধারণা
ল্যারি

@ অ্যালারিচাই হয়ত, আমি সাধারণত পাইথন 3 এ থাকি, কখনও কখনও পাইথন 2.7। প্রশ্নটি একটি নির্দিষ্ট সংস্করণে বাঁধা ছিল না।
আরডিএস

আমি পাইথন ৩.৪-এ আছি এবং লুপকে অনর্থক করে একটি স্যুট ফেরত আবিষ্কার করি।
ডুনস

ভবিষ্যতের ল্যারির জন্য: "পরীক্ষার আবিষ্কার সহ পাইথন ২.7-এ ইউনিটটেস্টে অনেকগুলি নতুন বৈশিষ্ট্য যুক্ত করা হয়েছিল। ইউনিটেস্ট 2 আপনাকে পাইথনের আগের সংস্করণগুলির সাহায্যে এই বৈশিষ্ট্যগুলি ব্যবহার করতে দেয়।"
টু-বিট অ্যালকেমিস্ট

8

আমি বিভিন্ন পদ্ধতির চেষ্টা করেছি তবে সবগুলি ত্রুটিযুক্ত বলে মনে হচ্ছে বা আমাকে কিছু কোড মেকআপ করতে হবে, এটি বিরক্তিকর। তবে লিনাক্সের অধীনে একটি দৃin় উপায় রয়েছে, তা হ'ল প্রতিটি পরীক্ষা নির্দিষ্ট প্যাটার্নের মাধ্যমে খুঁজে পাওয়া এবং তারপরে একে একে একে অনুরোধ করা।

find . -name 'Test*py' -exec python '{}' \;

এবং সবচেয়ে গুরুত্বপূর্ণ, এটি অবশ্যই কাজ করে।


7

প্যাকেজযুক্ত গ্রন্থাগার বা অ্যাপ্লিকেশনটির ক্ষেত্রে আপনি এটি করতে চান না। setuptools এটা আপনার জন্য কি করতে হবে

এই কমান্ডটি ব্যবহার করতে, আপনার প্রকল্পের পরীক্ষাগুলি unittestকোনও ফাংশন, একটি টেস্টকেস ক্লাস বা পদ্ধতি, বা ক্লাস সমেত একটি মডিউল বা প্যাকেজ দ্বারা টেস্ট স্যুটে আবৃত থাকতে হবে TestCase। যদি নামযুক্ত স্যুটটি একটি মডিউল হয়, এবং মডিউলের কোনও additional_tests()ফাংশন থাকে, তাকে বলা হয় এবং ফলাফলটি (যা অবশ্যই একটি হতে হবে unittest.TestSuite) চালানোর জন্য পরীক্ষাগুলিতে যুক্ত করা হয়। যদি নামযুক্ত স্যুটটি কোনও প্যাকেজ হয় তবে সামগ্রিক পরীক্ষার স্যুটটিতে যেকোন সাবমডিউল এবং সাবপ্যাকেজগুলি পুনরাবৃত্তভাবে যুক্ত করা হয়

আপনার মূল পরীক্ষার প্যাকেজটি কোথায় তা কেবল তা বলুন:

setup(
    # ...
    test_suite = 'somepkg.test'
)

এবং চালান python setup.py test

পাইথন 3-এ ফাইল-ভিত্তিক আবিষ্কার সমস্যাযুক্ত হতে পারে, যদি না আপনি নিজের পরীক্ষার স্যুটটিতে আপেক্ষিক আমদানি এড়ান, কারণ discoverফাইল আমদানি ব্যবহার করে। যদিও এটি top_level_diralচ্ছিক সমর্থন করে তবে আমার কিছু অসীম পুনরাবৃত্তি ত্রুটি ছিল। সুতরাং একটি প্যাকেজবিহীন কোডের একটি সহজ সমাধান হ'ল নিম্নলিখিতটি __init__.pyআপনার পরীক্ষার প্যাকেজটির মধ্যে রাখা ( লোড_সেটস প্রোটোকল দেখুন )।

import unittest

from . import foo, bar


def load_tests(loader, tests, pattern):
    suite = unittest.TestSuite()
    suite.addTests(loader.loadTestsFromModule(foo))
    suite.addTests(loader.loadTestsFromModule(bar))

    return suite

উত্তম উত্তর, এবং এটি মোতায়েনের আগে পরীক্ষাটি স্বয়ংক্রিয়করণ করতে ব্যবহৃত হতে পারে! ধন্যবাদ
আর্থার ক্লার্ক-ঘেরার্ডি

4

আমি পাইডিভ / লিসলিপ্স ব্যবহার করি এবং জিইউআই থেকে কীভাবে একবারে সমস্ত পরীক্ষা চালানো যায় তা সত্যই বুঝতে পারি নি। (সম্পাদনা করুন: আপনি ডানদিকে রুট টেস্ট ফোল্ডারটি ক্লিক করুন এবং চয়ন করুনRun as -> Python unit-test

এটি আমার বর্তমান কাজ:

import unittest

def load_tests(loader, tests, pattern):
    return loader.discover('.')

if __name__ == '__main__':
    unittest.main()

আমি allআমার পরীক্ষার ডিরেক্টরিতে ডাকা মডিউলটিতে এই কোডটি রেখেছি। যদি আমি LiClipse থেকে ইউনিটেট হিসাবে এই মডিউলটি চালিত করি তবে সমস্ত পরীক্ষা চালানো হয়। যদি আমি কেবল নির্দিষ্ট বা ব্যর্থ পরীক্ষাগুলির পুনরাবৃত্তি করতে বলি তবে কেবল সেই পরীক্ষাগুলিই চালিত হবে। এটি আমার কমান্ডলাইন টেস্ট রানারকে (ন্যাসেটসেট) বাধা দেয় না - এটি উপেক্ষা করা হয়।

discoverআপনার প্রকল্পের সেটআপের ভিত্তিতে আপনার পক্ষে যুক্তিগুলি পরিবর্তন করার দরকার হতে পারে ।


সমস্ত পরীক্ষা ফাইলের নাম এবং পরীক্ষার পদ্ধতির নাম "টেস্ট_" দিয়ে শুরু করা উচিত। অন্যথায় কমান্ড "হিসাবে চালান -> পাইথন ইউনিট পরীক্ষা" সেগুলি খুঁজে পাবে না।
স্টেফান

2

স্টিফেন ক্যাগলের উত্তরের ভিত্তিতে আমি নেস্টেড টেস্ট মডিউলগুলির জন্য সমর্থন যুক্ত করেছি।

import fnmatch
import os
import unittest

def all_test_modules(root_dir, pattern):
    test_file_names = all_files_in(root_dir, pattern)
    return [path_to_module(str) for str in test_file_names]

def all_files_in(root_dir, pattern):
    matches = []

    for root, dirnames, filenames in os.walk(root_dir):
        for filename in fnmatch.filter(filenames, pattern):
            matches.append(os.path.join(root, filename))

    return matches

def path_to_module(py_file):
    return strip_leading_dots( \
        replace_slash_by_dot(  \
            strip_extension(py_file)))

def strip_extension(py_file):
    return py_file[0:len(py_file) - len('.py')]

def replace_slash_by_dot(str):
    return str.replace('\\', '.').replace('/', '.')

def strip_leading_dots(str):
    while str.startswith('.'):
       str = str[1:len(str)]
    return str

module_names = all_test_modules('.', '*Tests.py')
suites = [unittest.defaultTestLoader.loadTestsFromName(mname) for mname 
    in module_names]

testSuite = unittest.TestSuite(suites)
runner = unittest.TextTestRunner(verbosity=1)
runner.run(testSuite)

কোডের সমস্ত সাব-অনুসন্ধান করে .জন্য *Tests.pyফাইল যা পরে লোড করা হয়। এটি প্রত্যাশা করে যে প্রত্যেকেরই *Tests.pyএকক শ্রেণি রয়েছে *Tests(unittest.TestCase)যা ঘুরে ফিরে লোড হয় এবং একের পর এক চালিত হয়।

এটি ডিরেক্টরি / মডিউলগুলির স্বেচ্ছাসেবী গভীর নেস্টিংয়ের সাথে কাজ করে তবে এর মধ্যে প্রতিটি ডিরেক্টরি __init__.pyঅন্তত একটি ফাঁকা ফাইল থাকা দরকার । এটি পরীক্ষা দ্বারা বিন্দু (দেখুন replace_slash_by_dot) দ্বারা স্ল্যাশ (বা ব্যাকস্ল্যাশ) প্রতিস্থাপন করে নেস্টেড মডিউলগুলি লোড করতে দেয় ।


2

এটি একটি পুরানো প্রশ্ন, তবে এখন (2019 এ) আমার জন্য কী কাজ করেছে তা হ'ল:

python -m unittest *_test.py

আমার সমস্ত পরীক্ষার ফাইলগুলি উত্স ফাইলগুলির মতো একই ফোল্ডারে রয়েছে এবং সেগুলি শেষ হয় _test



1

এই বেস স্ক্রিপ্টটি আপনি যে কোনও কার্যনির্বাহী ডিরেক্টরিতে থাকুন না কেন, ফাইল সিস্টেমের যে কোনও থেকে পাইথন ইউনিটেষ্ট পরীক্ষা পরীক্ষা চালায়: তার ডিরেক্টরি নির্দেশিকা যেখানে testঅবস্থিত সেখানে সর্বদা থাকুন ।

সমস্ত টেস্টস, স্বতন্ত্র $ পিডাব্লুডি

ইউনিটেস্ট পাইথন মডিউলটি আপনার বর্তমান ডিরেক্টরিতে সংবেদনশীল, যদি না আপনি এটি কোথায় না বলেন ( discover -sবিকল্প ব্যবহার করে )।

কাজ ./srcবা ./exampleডিরেক্টরি ডিরেক্টরিতে থাকার সময় এটি দরকারী এবং আপনার দ্রুত সামগ্রিক ইউনিট পরীক্ষা প্রয়োজন:

#!/bin/bash
this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

python -m unittest discover -s "$readlink"/test -v

নির্বাচিত পরীক্ষা, স্বতন্ত্র $ পিডাব্লুডি

আমি এই ইউটিলিটি ফাইলটির নাম দিয়েছি: runone.pyএবং এটি এর মতো ব্যবহার করুন:

runone.py <test-python-filename-minus-dot-py-fileextension>
#!/bin/bash
this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

(cd "$dirname"/test; python -m unittest $1)

test/__init__.pyউত্পাদনের সময় আপনার প্যাকেজ / মেমরি-ওভারহেড বোঝা করার জন্য কোনও ফাইলের দরকার নেই ।


-3

কমান্ড লাইন থেকে পরীক্ষা চালানোর জন্য একটি র‍্যাপার তৈরি করে আমার পদ্ধতিটি এখানে :

#!/usr/bin/env python3
import os, sys, unittest, argparse, inspect, logging

if __name__ == '__main__':
    # Parse arguments.
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument("-?", "--help",     action="help",                        help="show this help message and exit" )
    parser.add_argument("-v", "--verbose",  action="store_true", dest="verbose",  help="increase output verbosity" )
    parser.add_argument("-d", "--debug",    action="store_true", dest="debug",    help="show debug messages" )
    parser.add_argument("-h", "--host",     action="store",      dest="host",     help="Destination host" )
    parser.add_argument("-b", "--browser",  action="store",      dest="browser",  help="Browser driver.", choices=["Firefox", "Chrome", "IE", "Opera", "PhantomJS"] )
    parser.add_argument("-r", "--reports-dir", action="store",   dest="dir",      help="Directory to save screenshots.", default="reports")
    parser.add_argument('files', nargs='*')
    args = parser.parse_args()

    # Load files from the arguments.
    for filename in args.files:
        exec(open(filename).read())

    # See: http://codereview.stackexchange.com/q/88655/15346
    def make_suite(tc_class):
        testloader = unittest.TestLoader()
        testnames = testloader.getTestCaseNames(tc_class)
        suite = unittest.TestSuite()
        for name in testnames:
            suite.addTest(tc_class(name, cargs=args))
        return suite

    # Add all tests.
    alltests = unittest.TestSuite()
    for name, obj in inspect.getmembers(sys.modules[__name__]):
        if inspect.isclass(obj) and name.startswith("FooTest"):
            alltests.addTest(make_suite(obj))

    # Set-up logger
    verbose = bool(os.environ.get('VERBOSE', args.verbose))
    debug   = bool(os.environ.get('DEBUG', args.debug))
    if verbose or debug:
        logging.basicConfig( stream=sys.stdout )
        root = logging.getLogger()
        root.setLevel(logging.INFO if verbose else logging.DEBUG)
        ch = logging.StreamHandler(sys.stdout)
        ch.setLevel(logging.INFO if verbose else logging.DEBUG)
        ch.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(name)s: %(message)s'))
        root.addHandler(ch)
    else:
        logging.basicConfig(stream=sys.stderr)

    # Run tests.
    result = unittest.TextTestRunner(verbosity=2).run(alltests)
    sys.exit(not result.wasSuccessful())

সরলতার জন্য, দয়া করে আমার নন- PEP8 কোডিং মানটি ক্ষমা করুন ।

তারপরে আপনি আপনার সমস্ত পরীক্ষার জন্য সাধারণ উপাদানগুলির জন্য বেসস্টেস্ট শ্রেণি তৈরি করতে পারেন, সুতরাং আপনার প্রতিটি পরীক্ষার জন্য সহজভাবে দেখতে পাওয়া যাবে:

from BaseTest import BaseTest
class FooTestPagesBasic(BaseTest):
    def test_foo(self):
        driver = self.driver
        driver.get(self.base_url + "/")

চালানোর জন্য, আপনি কেবল কমান্ড লাইন আর্গুমেন্টের অংশ হিসাবে পরীক্ষা উল্লেখ করে যেমন:

./run_tests.py -h http://example.com/ tests/**/*.py

2
এই উত্তরের বেশিরভাগের পরীক্ষার আবিষ্কারের সাথে কোনও সম্পর্ক নেই (যেমন লগিং ইত্যাদি)। স্ট্যাক ওভারফ্লো প্রশ্নগুলির উত্তর দেওয়ার জন্য, সম্পর্কিত সম্পর্কযুক্ত কোডটি প্রদর্শন করে না।
কোরি গোল্ডবার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.