একটি ফিক্সিং ফাংশনে একটি প্যারামিটার পাস করুন


114

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

যেহেতু পরীক্ষক অবজেক্টটি ডিএলএল এর ভেরিয়েবল এবং ফাংশনগুলির রেফারেন্স পেয়েছে সেহেতু আমাকে প্রত্যেকটি পরীক্ষার ফাইলের জন্য পরীক্ষক বস্তুর জন্য ডিএলএল এর ভেরিয়েবলের একটি তালিকা পাস করতে হবে (লগ-ইন করার জন্য ভেরিয়েবলগুলি পরীক্ষার জন্য একই) । ফাইল)। তালিকার বিষয়বস্তু নির্দিষ্ট ডেটা লগ করতে ব্যবহৃত হবে।

আমার ধারণাটি এটি কোনওভাবে এটি করা:

import pytest

class MyTester():
    def __init__(self, arg = ["var0", "var1"]):
        self.arg = arg
        # self.use_arg_to_init_logging_part()

    def dothis(self):
        print "this"

    def dothat(self):
        print "that"

# located in conftest.py (because other test will reuse it)

@pytest.fixture()
def tester(request):
    """ create tester object """
    # how to use the list below for arg?
    _tester = MyTester()
    return _tester

# located in test_...py

# @pytest.mark.usefixtures("tester") 
class TestIt():

    # def __init__(self):
    #     self.args_for_tester = ["var1", "var2"]
    #     # how to pass this list to the tester fixture?

    def test_tc1(self, tester):
       tester.dothis()
       assert 0 # for demo purpose

    def test_tc2(self, tester):
       tester.dothat()
       assert 0 # for demo purpose

এটি কি এ জাতীয়ভাবে অর্জন করা সম্ভব নাকি আরও বেশি মার্জিত উপায় আছে?

সাধারণত আমি প্রতিটি পরীক্ষার পদ্ধতির জন্য এটি কোনও ধরণের সেটআপ ফাংশন (xUnit- স্টাইল) দিয়ে করতে পারি। তবে আমি এক ধরণের পুনঃব্যবহার করতে চাই। কেউ কি জানেন যে এটি ফিক্সার দিয়ে আদৌ সম্ভব কিনা?

আমি জানি আমি এরকম কিছু করতে পারি: (ডক্স থেকে)

@pytest.fixture(scope="module", params=["merlinux.eu", "mail.python.org"])

তবে আমার সরাসরি পরীক্ষার মডিউলটিতে প্যারামিট্রাইজেশন করা দরকার। পরীক্ষার মডিউল থেকে ফিক্সারের প্যারাম বৈশিষ্ট্য অ্যাক্সেস করা সম্ভব?

উত্তর:


101

আপডেট: যেহেতু এটি এই প্রশ্নের গৃহীত উত্তর এবং এখনও মাঝে মাঝে উত্সাহিত হয়, তাই আমার একটি আপডেট যুক্ত করা উচিত। যদিও (নীচে) আমার মূল উত্তর pytest পুরোনো সংস্করণে এই কাজ করার একমাত্র উপায় ছিল অন্যদের আছে লক্ষনীয় pytest এখন রাজধানী পরোক্ষ parametrization সমর্থন করে। উদাহরণস্বরূপ আপনি এই জাতীয় কিছু করতে পারেন (@ মিমিরিকের মাধ্যমে):

# test_parameterized_fixture.py
import pytest

class MyTester:
    def __init__(self, x):
        self.x = x

    def dothis(self):
        assert self.x

@pytest.fixture
def tester(request):
    """Create tester object"""
    return MyTester(request.param)


class TestIt:
    @pytest.mark.parametrize('tester', [True, False], indirect=['tester'])
    def test_tc1(self, tester):
       tester.dothis()
       assert 1
$ pytest -v test_parameterized_fixture.py
================================================================================= test session starts =================================================================================
platform cygwin -- Python 3.6.8, pytest-5.3.1, py-1.8.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: .
collected 2 items

test_parameterized_fixture.py::TestIt::test_tc1[True] PASSED                                                                                                                    [ 50%]
test_parameterized_fixture.py::TestIt::test_tc1[False] FAILED

যাইহোক, যদিও অপ্রত্যক্ষ প্যারামিট্রাইজেশনের এই রূপটি স্পষ্ট, @ ইউকিহিকো শিনোদা উল্লেখ করেছেন যে এটি এখন অন্তর্নিহিত পরোক্ষ প্যারামিট্রাইজেশনের একটি রূপকে সমর্থন করে (যদিও আমি সরকারী ডক্সে এর কোনও সুস্পষ্ট উল্লেখ খুঁজে পাইনি):

# test_parameterized_fixture2.py
import pytest

class MyTester:
    def __init__(self, x):
        self.x = x

    def dothis(self):
        assert self.x

@pytest.fixture
def tester(tester_arg):
    """Create tester object"""
    return MyTester(tester_arg)


class TestIt:
    @pytest.mark.parametrize('tester_arg', [True, False])
    def test_tc1(self, tester):
       tester.dothis()
       assert 1
$ pytest -v test_parameterized_fixture2.py
================================================================================= test session starts =================================================================================
platform cygwin -- Python 3.6.8, pytest-5.3.1, py-1.8.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: .
collected 2 items

test_parameterized_fixture2.py::TestIt::test_tc1[True] PASSED                                                                                                                   [ 50%]
test_parameterized_fixture2.py::TestIt::test_tc1[False] FAILED

আমি এই ফর্মটির শব্দার্থকগুলি ঠিক কী জানি না, তবে এটি মনে হয় যে pytest.mark.parametrizeসনাক্ত করে যে test_tc1পদ্ধতিটি যদিও যুক্তিটি যুক্তি হিসাবে গ্রহণ করে না tester_arg, তবে testerএটি যে ফিক্সচারটি ব্যবহার করছে তা করে, সুতরাং এটি প্যারামেট্রাইজড যুক্তিকে ফিক্সিংয়ের মধ্য দিয়ে যায় tester


আমারও একই রকম সমস্যা ছিল - আমার কাছে একটি ফিক্সচার বলা হয়েছে test_package, এবং পরে আমি নির্দিষ্ট পরীক্ষায় এটি চালানোর সময় সেই ফিক্সারের কাছে একটি alচ্ছিক যুক্তিটি পাস করতে সক্ষম হতে চাইতাম। উদাহরণ স্বরূপ:

@pytest.fixture()
def test_package(request, version='1.0'):
    ...
    request.addfinalizer(fin)
    ...
    return package

(এই উদ্দেশ্যগুলির জন্য এটি কোনও বিষয় নয় যে ফিক্সচারটি কী করে বা কী ধরণের জিনিস প্রত্যাবর্তিত হয় package) is

এরপরে কোনওভাবে কোনও পরীক্ষার ফাংশনে এই ফিক্সিংটি এমনভাবে ব্যবহার করা বাঞ্ছনীয় হবে যে আমি versionসেই পরীক্ষার সাথে সেই ফিক্সারের সাথে যুক্তিটিও নির্দিষ্ট করতে পারি । এটি বর্তমানে সম্ভব নয়, যদিও এটি একটি দুর্দান্ত বৈশিষ্ট্য তৈরি করে।

ইতিমধ্যে আমার ফিক্সচারটি কেবল এমন কোনও ফাংশন ফিরিয়ে দেওয়া সহজ হয়েছিল যা ফিক্সচারটি আগে কাজ করেছিল, তবে আমাকে versionযুক্তিটি নির্দিষ্ট করতে দেয় :

@pytest.fixture()
def test_package(request):
    def make_test_package(version='1.0'):
        ...
        request.addfinalizer(fin)
        ...
        return test_package

    return make_test_package

এখন আমি এটিকে আমার পরীক্ষামূলক ক্রিয়ায় যেমন ব্যবহার করতে পারি:

def test_install_package(test_package):
    package = test_package(version='1.1')
    ...
    assert ...

ইত্যাদি।

ওপি'র চেষ্টা করা সমাধানটি সঠিক দিকে নিয়ে গিয়েছিল, এবং @ এইচপিপি 42 এর উত্তর অনুসারে, MyTester.__init__অনুরোধটির অনুরোধটি কেবল একটি রেফারেন্স সঞ্চয় করে রাখতে পারে:

class MyTester(object):
    def __init__(self, request, arg=["var0", "var1"]):
        self.request = request
        self.arg = arg
        # self.use_arg_to_init_logging_part()

    def dothis(self):
        print "this"

    def dothat(self):
        print "that"

তারপরে স্থিরত্ব বাস্তবায়নের জন্য এটি ব্যবহার করুন:

@pytest.fixture()
def tester(request):
    """ create tester object """
    # how to use the list below for arg?
    _tester = MyTester(request)
    return _tester

MyTesterশ্রেণীর ইচ্ছা থাকলে শ্রেণিটি কিছুটা পুনর্গঠন করা যায় যাতে .argsএটি তৈরির পরে এর বৈশিষ্ট্যটি আপডেট করা যায়, স্বতন্ত্র পরীক্ষার জন্য আচরণটি টুইঙ্ক করতে।


ফিক্সিংয়ের ভিতরে ফাংশনটির সাথে ইঙ্গিতটির জন্য ধন্যবাদ। আমি এটির উপর আবার কাজ করতে না পেরে কিছু সময় নিলেও এটি বেশ কার্যকর!
ম্যাগি

2
এই বিষয়ে একটি সুন্দর ছোট পোস্ট: alysivji.github.io/pytest-fixures-with-function-arguments.html
Maggie

আপনি কি এই বলে ত্রুটি পেয়ে যাচ্ছেন না: "ফিক্সচারগুলি সরাসরি ডাকা হয় না, তবে পরীক্ষার কার্যগুলি প্যারামিটার হিসাবে অনুরোধ করলে স্বয়ংক্রিয়ভাবে তৈরি হয়" "
nz_21

153

এটি আসলে মাধ্যমে py.test মধ্যে স্থানীয়ভাবে সমর্থিত পরোক্ষ parametrization

আপনার ক্ষেত্রে, আপনি হবে:

@pytest.fixture
def tester(request):
    """Create tester object"""
    return MyTester(request.param)


class TestIt:
    @pytest.mark.parametrize('tester', [['var1', 'var2']], indirect=True)
    def test_tc1(self, tester):
       tester.dothis()
       assert 1

আহ, এটি বেশ সুন্দর (আমার ধারণা আপনার উদাহরণটি যদিও কিছুটা পুরানো হতে পারে - এটি সরকারী দস্তাবেজের উদাহরণ থেকে পৃথক)। এটি কি তুলনামূলকভাবে নতুন বৈশিষ্ট্য? আমি এর আগে কখনও এর মুখোমুখি হইনি। এটি সমস্যারও ভাল সমাধান - আমার উত্তরের চেয়ে কিছু উপায়ে।
ইগুয়ানানাট

2
আমি এই সমাধানটি ব্যবহার করার চেষ্টা করেছি তবে একাধিক পরামিতিগুলি পেরিয়ে যাওয়ার বা অনুরোধ ব্যতীত ভেরিয়েবলের নাম ব্যবহার করার ক্ষেত্রে সমস্যা ছিল। আমি @ আইগানানোট এর সমাধান ব্যবহার করে শেষ করেছি।
ভিক্টর উরিয়ার্তে

42
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সরকারী ডকুমেন্টেশন জন্য indirectশব্দ যুক্তি বোঝা যাচ্ছে যে নেতারা বিক্ষিপ্ত এবং অনাত্মীয়, যা সম্ভবত এই অপরিহার্য কৌশলের দুর্বোধ্যতা জন্য অ্যাকাউন্ট। আমি এই খুব বৈশিষ্ট্যটির জন্য একাধিক অনুষ্ঠানে পাই.েস্টেস্ট সাইটটি স্কোর করেছি - কেবল খালি, পুরানো এবং বিভ্রান্ত হয়ে উঠতে। তিক্ততা হল এমন একটি স্থান যা ধারাবাহিক সংহত হিসাবে পরিচিত। ওডিনকে স্ট্যাকওভারফ্লোর জন্য ধন্যবাদ।
সিসিল কারি

1
নোট করুন যে এই পদ্ধতিটি আপনার পরীক্ষার নামটিকে প্যারামিটার অন্তর্ভুক্ত করতে পরিবর্তন করে, যা পছন্দসই বা নাও হতে পারে। test_tc1হয়ে test_tc1[tester0]
jjj

1
সুতরাং indirect=Trueসমস্ত ডাকা ফিক্সচারগুলিতে পরামিতিগুলি হস্তান্তর করে, তাই না? কারণ ডকুমেন্টেশনে স্পষ্টতই অপ্রত্যক্ষ প্যারামিট্রাইজেশনের জন্য xindirect=['x']
ফিক্সারগুলির

11

আপনি ফিক্সচার ফাংশনগুলি থেকে অনুরোধকারী মডিউল / শ্রেণি / ফাংশন অ্যাক্সেস করতে পারেন (এবং এটি আপনার পরীক্ষক শ্রেণীর কাছ থেকে), কোনও ফিক্সচার ফাংশন থেকে পরীক্ষার প্রসঙ্গে অনুরোধের সাথে ইন্টারঅ্যাক্ট করতে দেখেন । সুতরাং আপনি কোনও শ্রেণি বা মডিউলটিতে কিছু পরামিতি ঘোষণা করতে পারেন এবং পরীক্ষক দৃ fi়তা এটি বাছাই করতে পারে।


3
আমি জানি আমি এটির মতো কিছু করতে পারি: (ডক্স থেকে) @ পাইস্টেস্ট.ফিকচার (স্কোপ = "মডিউল", প্যারাম = ["মার্লিনাক্স.ইউ", "মেইল.প্যাথন.আর.আর" ")) তবে আমার এটি করা দরকার পরীক্ষা মডিউল। আমি কীভাবে গতিশীলভাবে ফিক্সারে প্যারাম যুক্ত করতে পারি?
ম্যাগি

2
বিন্দুটি কোনও ফিক্সচার ফাংশন থেকে পরীক্ষার প্রসঙ্গে অনুরোধের সাথে ইন্টারঅ্যাক্ট করার নয় তবে ফিক্সচার ফাংশনে আর্গুমেন্টগুলি পাস করার জন্য একটি সুসংজ্ঞাত উপায় রয়েছে। নামগুলিতে সম্মত হয়ে যুক্তিগুলি গ্রহণের জন্য স্থিতির ফাংশনটিতে এক ধরণের অনুরোধ পরীক্ষার প্রসঙ্গে সচেতন হওয়া উচিত নয়। উদাহরণস্বরূপ, কেউ লিখতে সক্ষম হবে @fixture def my_fixture(request)এবং তারপরে @pass_args(arg1=..., arg2=...) def test(my_fixture)এই আরোগুলিটি my_fixture()এভাবে পেতে arg1 = request.arg1, arg2 = request.arg2। পাইস্টেস্টে এখন কি এরকম কিছু সম্ভব?
পাইওটর ডব্রোগস্ট

7

আমি কোনও দস্তাবেজ খুঁজে পাইনি তবে এটি পাইস্টের সর্বশেষ সংস্করণে কাজ করছে বলে মনে হচ্ছে।

@pytest.fixture
def tester(tester_arg):
    """Create tester object"""
    return MyTester(tester_arg)


class TestIt:
    @pytest.mark.parametrize('tester_arg', [['var1', 'var2']])
    def test_tc1(self, tester):
       tester.dothis()
       assert 1

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

1
আমি মনে করি আপনি যদি গিথুব.পাইটেস্ট-দেবী / স্পেসিটিস / পিসি / 77১২ এবং সম্পর্কিত (একীভূত) জনসংযোগটি দেখুন তবে বৈশিষ্ট্যটিতে এটি সম্ভব হবে না ।
নাদেজ


1
পরিষ্কার করতে, @ মাসপে 36 ইঙ্গিত দিচ্ছে যে লিঙ্কযুক্ত পিআরটি Nadègeউল্টে গেছে। সুতরাং, এই অনির্ধারিত বৈশিষ্ট্যটি (আমার মনে হয় এটি এখনও অপ্রশংসিত?) এখনও বেঁচে আছে।
ব্লাথায়ার

6

কিছুটা ইমিরিকের উত্তরের উন্নতি করার জন্য : এই সমস্যাটি সমাধানের আর একটি মার্জিত উপায় হ'ল "প্যারামিটার ফিক্সচার" তৈরি করা। আমি ব্যক্তিগতভাবে এটি indirectবৈশিষ্ট্যের চেয়ে বেশি পছন্দ করি pytest। এই বৈশিষ্ট্যটি থেকে পাওয়া যায় pytest_casesএবং আসল ধারণাটি সুপার 3 জিজিও দ্বারা প্রস্তাবিত হয়েছিল ।

import pytest
from pytest_cases import param_fixture

# create a single parameter fixture
var = param_fixture("var", [['var1', 'var2']], ids=str)

@pytest.fixture
def tester(var):
    """Create tester object"""
    return MyTester(var)

class TestIt:
    def test_tc1(self, tester):
       tester.dothis()
       assert 1

মনে রাখবেন যে pytest-casesএটি আপনাকে সরবরাহ করে @pytest_fixture_plusযে আপনার ফিক্সচারগুলিতে প্যারামিট্রাইজেশন চিহ্নগুলি ব্যবহার @cases_dataকরতে দেয় এবং এটি আপনাকে পৃথক মডিউলে ফাংশন থেকে আপনার পরামিতিগুলি উত্স করতে দেয়। বিশদ জন্য ডক দেখুন । আমি উপায় দ্বারা লেখক;)


1
এটি এখন সরল পাইস্টেও কাজ করছে বলে মনে হচ্ছে (আমার কাছে v5.3.1 আছে)। অর্থাৎ, আমি এই কাজটি ছাড়াই পেতে সক্ষম হয়েছি param_fixtureএই উত্তর দেখুন । যদিও ডক্সে এর মতো কোনও উদাহরণ আমি পাইনি; আপনি কি এটা সম্পর্কে কিছু জানেন?
ইগুয়ানানাট

তথ্য এবং লিঙ্ক জন্য ধন্যবাদ ! এটা সম্ভব ছিল আমার কোন ধারণা ছিল না। তাদের মনে কী রয়েছে তা দেখার জন্য কোনও সরকারী নথির জন্য অপেক্ষা করুন।
স্মার্ট

2

আমি একটি মজার সাজসজ্জা তৈরি করেছি যা এই জাতীয় ফিক্সচারগুলি লেখার অনুমতি দেয়:

@fixture_taking_arguments
def dog(request, /, name, age=69):
    return f"{name} the dog aged {age}"

এখানে, আপনার বাম দিকে /অন্যান্য ফিক্সচার রয়েছে এবং ডানদিকে আপনার ব্যবহার করে সরবরাহ করা প্যারামিটার রয়েছে:

@dog.arguments("Buddy", age=7)
def test_with_dog(dog):
    assert dog == "Buddy the dog aged 7"

এটি একইভাবে ফাংশন আর্গুমেন্টগুলির কাজ করে। আপনি যদি ageযুক্তিটি সরবরাহ না করেন তবে 69তার পরিবর্তে ডিফল্ট একটি ব্যবহৃত হয়। যদি আপনি সরবরাহ না করেন nameবা ডেকরেটার বাদ দেন তবে dog.argumentsআপনি নিয়মিত পান TypeError: dog() missing 1 required positional argument: 'name'। আপনার যদি অন্য কোনও দৃxture়তা থাকে যা যুক্তি নিয়ে থাকে name, তবে এটির সাথে এটি বিরোধী নয়।

অ্যাসিঙ্ক ফিক্সচারগুলিও সমর্থিত।

অতিরিক্তভাবে, এটি আপনাকে একটি দুর্দান্ত সেটআপ পরিকল্পনা দেয়:

$ pytest test_dogs_and_owners.py --setup-plan

SETUP    F dog['Buddy', age=7]
...
SETUP    F dog['Champion']
SETUP    F owner (fixtures used: dog)['John Travolta']

একটি সম্পূর্ণ উদাহরণ:

from plugin import fixture_taking_arguments

@fixture_taking_arguments
def dog(request, /, name, age=69):
    return f"{name} the dog aged {age}"


@fixture_taking_arguments
def owner(request, dog, /, name="John Doe"):
    yield f"{name}, owner of {dog}"


@dog.arguments("Buddy", age=7)
def test_with_dog(dog):
    assert dog == "Buddy the dog aged 7"


@dog.arguments("Champion")
class TestChampion:
    def test_with_dog(self, dog):
        assert dog == "Champion the dog aged 69"

    def test_with_default_owner(self, owner, dog):
        assert owner == "John Doe, owner of Champion the dog aged 69"
        assert dog == "Champion the dog aged 69"

    @owner.arguments("John Travolta")
    def test_with_named_owner(self, owner):
        assert owner == "John Travolta, owner of Champion the dog aged 69"

সাজসজ্জার জন্য কোড:

import pytest
from dataclasses import dataclass
from functools import wraps
from inspect import signature, Parameter, isgeneratorfunction, iscoroutinefunction, isasyncgenfunction
from itertools import zip_longest, chain


_NOTHING = object()


def _omittable_parentheses_decorator(decorator):
    @wraps(decorator)
    def wrapper(*args, **kwargs):
        if not kwargs and len(args) == 1 and callable(args[0]):
            return decorator()(args[0])
        else:
            return decorator(*args, **kwargs)
    return wrapper


@dataclass
class _ArgsKwargs:
    args: ...
    kwargs: ...

    def __repr__(self):
        return ", ".join(chain(
               (repr(v) for v in self.args), 
               (f"{k}={v!r}" for k, v in self.kwargs.items())))


def _flatten_arguments(sig, args, kwargs):
    assert len(sig.parameters) == len(args) + len(kwargs)
    for name, arg in zip_longest(sig.parameters, args, fillvalue=_NOTHING):
        yield arg if arg is not _NOTHING else kwargs[name]


def _get_actual_args_kwargs(sig, args, kwargs):
    request = kwargs["request"]
    try:
        request_args, request_kwargs = request.param.args, request.param.kwargs
    except AttributeError:
        request_args, request_kwargs = (), {}
    return tuple(_flatten_arguments(sig, args, kwargs)) + request_args, request_kwargs


@_omittable_parentheses_decorator
def fixture_taking_arguments(*pytest_fixture_args, **pytest_fixture_kwargs):
    def decorator(func):
        original_signature = signature(func)

        def new_parameters():
            for param in original_signature.parameters.values():
                if param.kind == Parameter.POSITIONAL_ONLY:
                    yield param.replace(kind=Parameter.POSITIONAL_OR_KEYWORD)

        new_signature = original_signature.replace(parameters=list(new_parameters()))

        if "request" not in new_signature.parameters:
            raise AttributeError("Target function must have positional-only argument `request`")

        is_async_generator = isasyncgenfunction(func)
        is_async = is_async_generator or iscoroutinefunction(func)
        is_generator = isgeneratorfunction(func)

        if is_async:
            @wraps(func)
            async def wrapper(*args, **kwargs):
                args, kwargs = _get_actual_args_kwargs(new_signature, args, kwargs)
                if is_async_generator:
                    async for result in func(*args, **kwargs):
                        yield result
                else:
                    yield await func(*args, **kwargs)
        else:
            @wraps(func)
            def wrapper(*args, **kwargs):
                args, kwargs = _get_actual_args_kwargs(new_signature, args, kwargs)
                if is_generator:
                    yield from func(*args, **kwargs)
                else:
                    yield func(*args, **kwargs)

        wrapper.__signature__ = new_signature
        fixture = pytest.fixture(*pytest_fixture_args, **pytest_fixture_kwargs)(wrapper)
        fixture_name = pytest_fixture_kwargs.get("name", fixture.__name__)

        def parametrizer(*args, **kwargs):
            return pytest.mark.parametrize(fixture_name, [_ArgsKwargs(args, kwargs)], indirect=True)

        fixture.arguments = parametrizer

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