কমান্ড লাইনের মাধ্যমে ইউনিটেস্ট.টেষ্টক্যাস থেকে একক পরীক্ষা চালানো


256

আমাদের দলে, আমরা বেশিরভাগ পরীক্ষার কেসগুলি এর মতো সংজ্ঞায়িত করি:

একটি "কাঠামো" শ্রেণি ourtcfw.py:

import unittest

class OurTcFw(unittest.TestCase):
    def setUp:
        # something

    # other stuff that we want to use everywhere

এবং অনেক পরীক্ষার ক্ষেত্রে যেমন টেস্টমাইকেস.পি:

import localweather

class MyCase(OurTcFw):

    def testItIsSunny(self):
        self.assertTrue(localweather.sunny)

    def testItIsHot(self):
        self.assertTrue(localweather.temperature > 20)

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

যখন আমি নতুন পরীক্ষার কোডটি লিখছি এবং প্রায়শই এটি চালাতে চাই এবং সময় সাশ্রয় করি তখন আমি যা করি তা হ'ল আমি অন্যান্য সমস্ত পরীক্ষার সামনে "__" রেখেছি। তবে এটি জটিল, আমি যে কোডটি লিখছি তা থেকে আমাকে বিভ্রান্ত করে এবং এই প্রতিশ্রুতিবদ্ধ গোলমালটি স্পষ্ট বিরক্তিকর।

সুতরাং যেমন পরিবর্তন করার সময় testItIsHot(), আমি এটি করতে সক্ষম হতে চাই:

$ python testMyCase.py testItIsHot

এবং শুধুমাত্রunittest চালানো হয়েছে testItIsHot()

আমি কীভাবে এটি অর্জন করতে পারি?

আমি সেই if __name__ == "__main__":অংশটি আবারও লেখার চেষ্টা করেছি , তবে যেহেতু আমি পাইথনে নতুন আছি, আমি নিজেকে হারিয়ে যাওয়ার অনুভূতি বোধ করছি এবং পদ্ধতিগুলি বাদে অন্য কোনও কিছুর দিকে ঝুঁকতে থাকি।

উত্তর:


311

এটি আপনার পরামর্শ মতো কাজ করে - আপনাকে কেবল শ্রেণীর নামও নির্দিষ্ট করতে হবে:

python testMyCase.py MyCase.testItIsHot

2
আহারে! যেহেতু পাইথন ২..6 এ পরীক্ষা চালানো হয় (আমি যখন পাইথন ২..7 দিয়ে পরীক্ষাগুলি করতে পারি তার 99 %%), তাই আমি 2.6.8 ডকটির দিকে চেয়েছিলাম এবং এতটা মিস করেছি! :-)
অ্যালোইস মাহদল

1
কেবলমাত্র লক্ষ্য করা গেছে যে এই পদ্ধতিটি কেবলমাত্র "টেস্ট *" বলা হয়, সুতরাং দুর্ভাগ্যক্রমে এটি কখনও কখনও পরীক্ষা চালানো যায় না যা নাম পরিবর্তন করে "অক্ষম" করা হয়
অ্যালোস মাহদল

4
একটি উপ-ডিরেক্টরিতে পরীক্ষার জন্য কাজ করে না - একটি পরিপক্ক পাইথন প্রোগ্রামের সবচেয়ে সাধারণ ক্ষেত্রে।
টম সওয়ারি

4
@ টমসওয়ার্লি এখন যাচাই করতে পারে না তবে আমি মনে করি আপনি __init__.pyএই নির্দেশিকার ভিতরে (খালি) ক্রেট তৈরি করে (এবং কোনও সাবডিয়ার্স, যদি থাকে) এবং যেমন কল করেও এটি করতে পারেন । python test/testMyCase.py test.MyCase.testItIsHot
আলাইস মাহডাল

1
আমি যখন এটি করি তখন কিছুই হয় না। আমি কাজের ক্ষেত্রগুলি খুঁজে পেয়েছি, তবে আমি আশা করছি যে এই পদ্ধতিটি আমার পক্ষে কার্যকর হবে।
জো ফ্ল্যাক 15

152

যদি আপনি আপনার পরীক্ষার কেসগুলি সংগঠিত করেন, তা হ'ল প্রকৃত কোডের মতো একই সংস্থাটি অনুসরণ করুন এবং একই প্যাকেজের মডিউলগুলির জন্য আপেক্ষিক আমদানিও ব্যবহার করুন

আপনি নিম্নলিখিত কমান্ড ফর্ম্যাটটি ব্যবহার করতে পারেন:

python -m unittest mypkg.tests.test_module.TestClass.test_method
# In your case, this would be:
python -m unittest testMyCase.MyCase.testItIsHot

পাইথন 3 ডকুমেন্টেশন এর জন্য: https://docs.python.org/3/library/unittest.html#command-line-interface


এটি এত জঘন্য জাভা-এস্কো। "দীর্ঘ_মডিউল_নাম.সেমালং-নেম এ্যাস্যাক্লাস.টেষ্ট_লং_নাম_বিজিনিং_উথ_স্টেস্ট_এএস_এ_ কনভেনশন" ... আরও ভাল আশা আপনি তাদের কোড পরীক্ষা করে এমন একজন বুদ্ধিমান ব্যক্তির মতো স্যুটগুলিতে মডুলার করেন নি।
জোশুয়া ডিটওয়েলার

69

এটি আপনি অনুমান হিসাবে ভাল কাজ করতে পারে

python testMyCase.py MyCase.testItIsHot

এবং কেবল পরীক্ষার আরও একটি উপায় রয়েছে testItIsHot:

    suite = unittest.TestSuite()
    suite.addTest(MyCase("testItIsHot"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

11
আমি এই উত্তরের দ্বিতীয় অংশটি অত্যন্ত সহায়ক বলে খুঁজে পেয়েছি: আমি এক্লিপস + পাইডিভে পরীক্ষা লিখছি এবং আমি কমান্ড লাইনে যেতে চাই না!
জিওভান্নি দি মিলিয়া

25

আপনি যদি ইউনিটেটেস্ট মডিউলটির সহায়তা পরীক্ষা করে থাকেন তবে এটি আপনাকে বেশ কয়েকটি সংমিশ্রণের কথা জানায় যা আপনাকে মডিউল থেকে পরীক্ষার কেস ক্লাস চালানোর অনুমতি দেয় এবং পরীক্ষার কেস ক্লাস থেকে পরীক্ষা পদ্ধতিগুলি।

python3 -m unittest -h

[...]

Examples:
  python3 -m unittest test_module               - run tests from test_module
  python3 -m unittest module.TestClass          - run tests from module.TestClass
  python3 -m unittest module.Class.test_method  - run specified test method

এটি আপনাকে unittest.main()আপনার মডিউলটির ডিফল্ট আচরণ হিসাবে সংজ্ঞায়িত করার প্রয়োজন হয় না ।


2
+1 এবং যেহেতু পরিভাষাটি কোনও ভাষার ক্ষেত্রে নতুন হলে বিভ্রান্তিকর হতে পারে (এবং এটি usageএমনকি অদ্ভুতভাবে বেমানান): দৌড়ানো python -m unittest module_test.TestClass.test_methodকোনও ফাইল ধরে নেয় module_test.py(বর্তমান ডিরেক্টরি থেকে চালানো হয় এবং __init.py__এটি প্রয়োজন হয় না ); এবং module_test.pyএতে রয়েছে class TestClass(unittest.TestCase)...যা def test_method(self,...)(এটি পাইথন ২.7.১৩ এও আমার জন্য কাজ করে)
মাইকেল 25

10

হতে পারে, এটি কারও পক্ষে সহায়ক হবে। আপনি যদি নির্দিষ্ট ক্লাস থেকে কেবল পরীক্ষা চালাতে চান তবে:

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

এটি অজগর 3.6 এ আমার জন্য কাজ করে


3

@ ইয়ার্কি দ্বারা অনুপ্রাণিত হয়ে আমি ইতিমধ্যে পেয়েছি এমন কয়েকটি কোডের সাথে এটি সংযুক্ত করেছি। 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() )

তথ্যসূত্র:

  1. ইউনিটেটেস্ট মডিউল যখন কোনও স্ক্রিপ্টে থাকে তখন sys.argv [1] এর সাথে সমস্যা
  2. পাইথন ক্লাসে সমস্ত ক্রিয়াকলাপ চালিয়ে যাওয়ার এবং কার্যকর করার কোনও উপায় আছে কি?
  3. পাইথনের একটি শ্রেণীর সমস্ত সদস্য ভেরিয়েবলের উপর লুপিং

সর্বশেষ মূল প্রোগ্রামটির বিকল্প হিসাবে, unittest.main()পদ্ধতিটি প্রয়োগের পরে আমি নিম্নলিখিত পরিবর্তনের সাথে উপস্থিত হয়েছি :

  1. 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() )

3

টিএল; ডিআর : এটি সম্ভবত সম্ভবত কাজ করবে:

python mypkg/tests/test_module.py MyCase.testItIsHot

ব্যাখ্যা :

  • সুবিধাজনক উপায়

    python mypkg/tests/test_module.py MyCase.testItIsHot

    তবে এর অব্যক্ত অনুমানটি কাজ করবে যে আপনি ইতিমধ্যে আপনার পরীক্ষার ফাইলটির অভ্যন্তরে (সাধারণত শেষে) এই প্রচলিত কোড স্নিপেট রয়েছে।

    if __name__ == "__main__":
        unittest.main()
  • অসুবিধার উপায়

    python -m unittest mypkg.tests.test_module.TestClass.test_method

    if __name__ == "__main__": unittest.main()আপনার পরীক্ষার উত্স ফাইলে সেই কোড স্নিপেটের প্রয়োজন ছাড়াই সর্বদা কাজ করবে ।

তাহলে ২ য় পদ্ধতিটি অসুবিধে হিসাবে বিবেচনা করা হবে কেন? কারণ হাত দিয়ে সেই দীর্ঘ, বিন্দু-বিস্মৃত পথটি টাইপ করার জন্য ( আপনার শরীরের অংশের একটি এখানে sertোকান _) এ ব্যথা হবে । 1 ম পদ্ধতিতে mypkg/tests/test_module.pyঅংশটি আধুনিক শেল দ্বারা বা আপনার সম্পাদক দ্বারা স্বয়ংক্রিয়ভাবে সম্পন্ন করা যেতে পারে।

পিএস: আপনি যদি ভাবেন যে শরীরের অংশটি আপনার কোমরের নীচে রয়েছে তবে আপনি একজন খাঁটি ব্যক্তি। :-) আমি "আঙুলের জয়েন্ট" বলতে চাইছি। খুব বেশি টাইপিং আপনার জয়েন্টগুলির জন্য খারাপ হবে। ;-)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.