আমি পরীক্ষাগুলি সহ আমার পাইস্ট ক্লাসের জন্য কীভাবে সঠিকভাবে সেটআপ এবং টিয়ারডাউন করব?


114

আমি শেষ থেকে শেষের পরীক্ষার জন্য সেলেনিয়াম ব্যবহার করছি এবং কীভাবে ব্যবহার করব setup_classএবং teardown_classপদ্ধতিগুলি আমি পাচ্ছি না ।

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

তবে যৌক্তিকভাবে এটি একটি খারাপ সমাধানের মতো বলে মনে হচ্ছে, কারণ বাস্তবে আমার পরীক্ষাগুলি ক্লাসের সাথে কাজ করবে না, তবে অবজেক্টের সাথে। আমি selfপ্রতিটি পরীক্ষার পদ্ধতির অভ্যন্তরে পরম পাস করি , তাই আমি বস্তুর বারগুলি অ্যাক্সেস করতে পারি:

class TestClass:
  
    def setup_class(cls):
        pass
        
    def test_buttons(self, data):
        # self.$attribute can be used, but not cls.$attribute?  
        pass
        
    def test_buttons2(self, data):
        # self.$attribute can be used, but not cls.$attribute?
        pass
        
    def teardown_class(cls):
        pass
    

এমনকি এটি ক্লাসের জন্য ব্রাউজার উদাহরণ তৈরি করাও ঠিক হবে না বলে মনে হচ্ছে .. এটি প্রতিটি বস্তুর জন্য আলাদাভাবে তৈরি করা উচিত, তাই না?

তাই, আমি ব্যবহার করতে হবে __init__এবং __del__পরিবর্তে পদ্ধতি setup_classএবং teardown_class?

উত্তর:


102

ফিক্সচার ফাইনালাইজেশন / এক্সিকিউটিভ টেরডাউন কোড অনুসারে সেটআপ এবং টিয়ারডাউন ব্যবহারের জন্য বর্তমানের সেরা অনুশীলনটি yieldপরিবর্তে ব্যবহার করা হয় return:

import pytest

@pytest.fixture()
def resource():
    print("setup")
    yield "resource"
    print("teardown")

class TestResource:
    def test_that_depends_on_resource(self, resource):
        print("testing {}".format(resource))

এটি চালানো ফলাফল

$ py.test --capture=no pytest_yield.py
=== test session starts ===
platform darwin -- Python 2.7.10, pytest-3.0.2, py-1.4.31, pluggy-0.3.1
collected 1 items

pytest_yield.py setup
testing resource
.teardown


=== 1 passed in 0.01 seconds ===

টিয়ারডাউন কোডটি লেখার আরেকটি উপায় requestহ'ল আপনার ফিক্সচার ফাংশনে একটি- প্রবন্ধের জিনিস গ্রহণ করা এবং request.addfinalizerএকটি পদ্ধতিতে টিয়ারডাউনটি এক বা একাধিকবার সঞ্চালনের সাথে এর পদ্ধতিটি কল করা :

import pytest

@pytest.fixture()
def resource(request):
    print("setup")

    def teardown():
        print("teardown")
    request.addfinalizer(teardown)
    
    return "resource"

class TestResource:
    def test_that_depends_on_resource(self, resource):
        print("testing {}".format(resource))

সুতরাং আপনি এটি প্রতি পরীক্ষার ফাইলে এটি অনুলিপি করছেন যে আপনি সংস্থান প্রয়োজন?
অ্যান্ডি হেডেন

কিভাবে আপনি আপনার রাজধানী লিখতে উপর নির্ভর করে @AndyHayden, আপনি এটি প্রত্যেক পরীক্ষা ফাইল যেখানে আপনি এটি প্রয়োজন পুরা পারে অথবা আপনি একটি conftest.py ফাইলে এটা করা হতে পারে stackoverflow.com/questions/34466027/...
এভারেট Toews

4
এটি অবশ্য কোনও ক্লাস সেটআপ নয়, তাই না? এটি ক্লাসে প্রতিটি পরীক্ষার পদ্ধতির আগেই কার্যকর করা হত।
মলহার

4
এই বিশেষ ক্ষেত্রে, এটি কেবলমাত্র পরীক্ষার পদ্ধতিতে পরম হিসাবে ব্যবহৃত হলে কার্যকর করা হয়। যেমন পরম resourceইনtest_that_depends_on_resource(self, resource)
এভারেট টিউজ

4
নোট করুন যে আপনি কোনও ক্লাসের প্যারামিটার হিসাবে কোনও পরীক্ষার কলকে অন্তর্ভুক্ত না করেই প্রতিটি ক্লাসের জন্য একবার কোড আহ্বান করা হয়েছে তা নিশ্চিত করতে আপনি 'শ্রেণি' এবং স্বাচ্ছন্দকে যথাযথভাবে সেট করতে পারেন: শ্রেণি ", স্বতঃ = সত্য) ডিএফ রিসোর্স (): মুদ্রণ (" সেটআপ ") উত্পাদন" উত্স "মুদ্রণ (" টিয়ারডাউন ")` ``
ক্রিস

69

আপনি যখন "শ্রেণি পদ্ধতি হিসাবে সংজ্ঞায়িত পরীক্ষাগুলি" লেখেন , আপনি কি সত্যই শ্রেণি পদ্ধতিগুলি (যে পদ্ধতিগুলি প্রথম শ্রেণীর হিসাবে এটির ক্লাস গ্রহণ করে ) বা কেবল নিয়মিত পদ্ধতি ( প্রথম প্যারামিটার হিসাবে উদাহরণ প্রাপ্ত পদ্ধতিগুলি) বোঝায় ?

আপনার উদাহরণটি selfপরীক্ষার পদ্ধতিগুলির জন্য যেহেতু আমি পরবর্তীকালে ধরে নিচ্ছি তাই আপনার setup_methodপরিবর্তে কেবল এটি ব্যবহার করতে হবে:

class Test:

    def setup_method(self, test_method):
        # configure self.attribute

    def teardown_method(self, test_method):
        # tear down self.attribute

    def test_buttons(self):
        # use self.attribute for test

পরীক্ষার পদ্ধতি উদাহরণটি পাস করা হয়েছে setup_methodএবং teardown_method, তবে যদি আপনার সেটআপ / টিয়ারডাউন কোডটি পরীক্ষার প্রসঙ্গটি জানার প্রয়োজন না হয় তবে তা উপেক্ষা করা যায়। আরও তথ্য এখানে পাওয়া যাবে

আমি আরও প্রস্তাব দিচ্ছি যে আপনি পাইস্টেস্টের ফিক্সারের সাথে নিজেকে পরিচিত করুন , কারণ এগুলি আরও শক্তিশালী ধারণা।


4
ফিক্সচারগুলি শ্রেণিবদ্ধ পদ্ধতির চেয়ে দুর্বল: তারা তাদের দ্বারা তৈরি না হওয়া বস্তুর ধ্বংসের অনুমতি দেয় না (যা প্রায়শই সত্যই প্রয়োজনীয়)। তা ছাড়া, তথ্যের জন্য আপনাকে ধন্যবাদ।
wvxvw

পাইকস্টের একটি 3.0.x রিলিজ থেকে 4.x ভেরিয়েন্ট পর্যন্ত কোডবেস আপগ্রেড করার সময় এটি আমাকে আঘাত করেছে। setup_classবিদ্রূপযুক্ত পদ্ধতি এবং এর মতো ব্যবহার করা কিছু পুরানো কোডকে আধুনিকীকরণ করা দরকার। setup_class(self, foo, bar)->setup_method(self,function,foo,bar)
jxramos

30

এটি http://docs.pytest.org/en/latest/xunit_setup.html সহায়তা করতে পারে

আমার পরীক্ষার স্যুটে, আমি আমার পরীক্ষার কেসগুলি ক্লাসে গ্রুপ করি। সেটআপ এবং টিয়ারডাউনটির জন্য আমার সেই শ্রেণীর সমস্ত পরীক্ষার ক্ষেত্রে প্রয়োজন, আমি setup_class(cls)এবং teardown_class(cls)শ্রেণিবদ্ধগুলি ব্যবহার করি ।

এবং সেটআপ এবং টিয়ারডাউনটির জন্য আমার প্রতিটি পরীক্ষার কেস প্রয়োজন, আমি setup_method(method)এবং ব্যবহার করিteardown_method(methods)

উদাহরণ:

lh = <got log handler from logger module>

class TestClass:
    @classmethod
    def setup_class(cls):
        lh.info("starting class: {} execution".format(cls.__name__))

    @classmethod
    def teardown_class(cls):
        lh.info("starting class: {} execution".format(cls.__name__))

    def setup_method(self, method):
        lh.info("starting execution of tc: {}".format(method.__name__))

    def teardown_method(self, method):
        lh.info("starting execution of tc: {}".format(method.__name__))

    def test_tc1(self):
        <tc_content>
        assert 

    def test_tc2(self):
        <tc_content>
        assert

এখন যখন আমি আমার পরীক্ষাগুলি পরিচালনা করি, যখন টেস্টক্লাসের কার্যকরকরণ শুরু হয়, এটি কখন কার্যকর হয় এবং কখন পদ্ধতিগুলি কার্যকর হয় তার জন্য বিশদটি লগ করে log

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

আশা করি এটা সাহায্য করবে!


হাই কিরান, setup_classবনাম এর মধ্যে পার্থক্য কী setup_method?
imsrgadich

4
@imsrgadich আপনি যখন নিজের পরীক্ষার কেসগুলি ক্লাসে সংগঠিত করেন, <ক্লাস সেটআপ / টিয়ারডাউন> _ক্লাসটি শ্রেণীর সেটআপ এবং টিয়ারডাউন পদক্ষেপের জন্য ব্যবহৃত হয় এবং <টেস্টাউন / টিয়ারডাউন> _ মেমথিউড প্রতিটি পরীক্ষার কেস পদ্ধতির জন্য স্বতন্ত্র পদক্ষেপ।
কিরণ ভেমুরি

4
জঘন্য ... এখন আমি পেয়েছি! কয়েক ঘন্টা এটি আটকে ছিল। সুতরাং, জিনিসকে দৃষ্টিভঙ্গিতে রাখি put <setup/teardown>_classপুরো ক্লাসের জন্য। এখানে, ডিবিতে লিঙ্ক সেট করা বা ডেটা ফাইলটি লোড করার মতো জিনিস হতে পারে। এবং তারপরে, প্রতিটি পরীক্ষার কেস আকারে তাদের নিজস্ব সেটআপ থাকতে পারে <setup/teardown>_method। বিষয়গুলি এখন অনেক পরিষ্কার। অনেক ধন্যবাদ!
imsrgadich

24

@ ব্রুনো যেমন পরামর্শ দিয়েছেন, পাইস্টেস্ট ফিক্সচার ব্যবহার করা অন্য সমাধান যা পরীক্ষার ক্লাস বা এমনকি সহজ পরীক্ষার ফাংশন উভয়ের জন্যই অ্যাক্সেসযোগ্য। পাইথন 2.7 ফাংশন পরীক্ষা করার জন্য এখানে একটি উদাহরণ রয়েছে :

import pytest

@pytest.fixture(scope='function')
def some_resource(request):
    stuff_i_setup = ["I setup"]

    def some_teardown():
        stuff_i_setup[0] += " ... but now I'm torn down..."
        print stuff_i_setup[0]
    request.addfinalizer(some_teardown)

    return stuff_i_setup[0]

def test_1_that_needs_resource(some_resource):
    print some_resource + "... and now I'm testing things..."

সুতরাং, চলমান test_1...উত্পাদন করে:

I setup... and now I'm testing things...
I setup ... but now I'm torn down...

ফিজিক্সে stuff_i_setupরেফারেন্স পাওয়া যায় তা লক্ষ্য করুন , সেই বস্তুটি হতে দেওয়া setupএবং torn downএটি পরীক্ষার জন্য এটি ইন্টারঅ্যাক্ট করছে। আপনি কল্পনা করতে পারেন এটি একটি অবিচ্ছিন্ন অবজেক্টের জন্য যেমন দরকারী অনুমানের ডাটাবেস বা কিছু সংযোগের জন্য কার্যকর হতে পারে যা এগুলি পৃথক রাখতে প্রতিটি পরীক্ষা চালানোর আগেই তা সাফ করতে হবে।


14

আপনি যদি @classmethodসজ্জক যুক্ত করেন তবে আপনার কোডটি যেমন আশা করবেন ঠিক তেমনই কাজ করা উচিত ।

@classmethod 
def setup_class(cls):
    "Runs once per class"

@classmethod 
def teardown_class(cls):
    "Runs at end of class"

Http://pythontesting.net/framework/pytest/pytest-xunit-style-fixtures/ দেখুন


ডকুমেন্টেশনে প্রদর্শিত হ'ল এটি ঠিক। ডকটির সাথে আমার যে সমস্যাটি হয়েছিল তা হ'ল আমার প্রসঙ্গটি বুঝতে অসুবিধা হয়েছিল: স্বতন্ত্রভাবে .তিহ্যগতভাবে নিজেকে স্বতন্ত্র হিসাবে উল্লেখ করা হয়, ক্লাস নয়, তাই ক্লাসের প্রসঙ্গেই এটি আমার কাছে অদ্ভুত বলে মনে হয়েছিল। কিরণ (উপরে) এই প্রসঙ্গটি সরবরাহ করে।
কগনিটি্যাক্লেভস

4
@ কনগিনিটিাক্লেভস "স্ব স্ব হিসাবে প্রচলিতভাবে স্ব হিসাবে চিহ্নিত হন, ক্লাস নয়" হ্যাঁ, selfউদাহরণের পদ্ধতিগুলির জন্য ব্যবহৃত হয়, যেখানে প্রথম যুক্তিটি নির্দিষ্ট অবজেক্ট উদাহরণ যার উপর পদ্ধতি অপারেশনটি চলছে, এবং clsএসগুলির জন্য ব্যবহৃত হয় @classmethod, যা আবদ্ধ ক্লাস এবং ক্লাসের উদাহরণ নয় (অর্থাত্ কোনও বস্তু)।
কোড_ড্রেড

2
import pytest
class Test:
    @pytest.fixture()
    def setUp(self):
        print("setup")
        yield "resource"
        print("teardown")

    def test_that_depends_on_resource(self, setUp):
        print("testing {}".format(setUp))

চালানোর জন্য:

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