পাইস্টে, কনফেস্টে.পি ফাইল ব্যবহার কী?


216

আমি সম্প্রতি আবিষ্কার করেছি pytest। দারুণ লাগছে। তবে আমি মনে করি ডকুমেন্টেশনটি আরও ভাল হতে পারে।

conftest.pyফাইলগুলি কী ব্যবহার করা হচ্ছে তা বোঝার চেষ্টা করছি ।

আমার (বর্তমানে ছোট) পরীক্ষার স্যুটটিতে আমার conftest.pyপ্রকল্পের মূলটিতে একটি ফাইল রয়েছে। আমি আমার পরীক্ষাগুলিতে যে ফিক্সচারগুলি ইনজেক্ট করি তা সংজ্ঞায়িত করতে এটি ব্যবহার করি।

আমার দুটি প্রশ্ন আছে:

  1. এটি কি সঠিক ব্যবহার conftest.py? এর অন্যান্য ব্যবহার আছে কি?
  2. আমি কি একাধিক conftest.pyফাইল রাখতে পারি ? আমি কখন এটা করতে চাই? উদাহরণগুলি প্রশংসা করা হবে।

আরও সাধারণভাবে, আপনি কীভাবে conftest.pyএকটি পাইস্টেস্ট টেস্ট স্যুটটিতে ফাইল (গুলি) এর উদ্দেশ্য এবং সঠিক ব্যবহারটি সংজ্ঞায়িত করবেন ?


8
আপনি আমাকে ছিলIt seems great. However, I feel the documentation could be better.
user9074332

6
হ্যাঁ, ডকুমেন্টেশন এত ভাল হতে পারে। আমি পুরো পাইস্টেস্ট ডকুমেন্টেশনগুলির জন্য অনুসন্ধান করেছি conftest.pyএবং যদিও এই জিনিসটি করার বা প্রতিযোগিতামূলক ফাইলের সাহায্যে এই জিনিসটি করার অনেকগুলি রেফারেন্স রয়েছে তবে নথিতে কোন কোথাও এটি ইঙ্গিত দেয় না যে পাইস্টেস্ট যখন পরীক্ষা করে, তখন সমস্ত কনটেস্ট.পি ফাইল পাওয়া যায় (এর মধ্যে ডিরেক্টরি স্ট্রুকুটার যা দিয়ে পরীক্ষা করা হচ্ছে তা পরীক্ষা সংগ্রহের পর্যায়ে চালিত হবে (কোনও পরীক্ষা চালানোর আগে)। পরীক্ষার মাধ্যমে নিজেকে খুঁজে বের করতে হয়েছিল।
ড্যানিয়েল গোল্ডফার্ব

উত্তর:


287

এটি কি কনফেস্ট.পিটির সঠিক ব্যবহার?

হ্যাঁ তাই হয়। ফিক্সচারগুলি এর সম্ভাব্য এবং সাধারণ ব্যবহার conftest.py। আপনি যে ফিক্সচারগুলি নির্ধারণ করবেন তা আপনার পরীক্ষার স্যুটের সমস্ত পরীক্ষার মধ্যে ভাগ করা হবে। তবে, মূলটিতে ফিক্সচারগুলি সংজ্ঞায়িত conftest.pyকরা অকেজো হতে পারে এবং যদি এই ধরনের ফিক্সচারগুলি সমস্ত পরীক্ষার দ্বারা ব্যবহার না করা হয় তবে এটি পরীক্ষার গতি কমিয়ে দেয়।

এর অন্যান্য ব্যবহার আছে কি?

হ্যাঁ এটা করে.

  • ফিক্সচার : পরীক্ষার দ্বারা ব্যবহৃত স্থির তথ্যের জন্য ফিক্সচারগুলি সংজ্ঞায়িত করুন। অন্যথায় সুনির্দিষ্ট না করা হলে এই ডেটা স্যুটে সমস্ত পরীক্ষা দ্বারা অ্যাক্সেস করা যেতে পারে। এটি ডেটা পাশাপাশি মডিউলগুলির সহায়ক হতে পারে যা সমস্ত পরীক্ষায় পাস করা হবে।

  • বাহ্যিক প্লাগইন লোডিং : conftest.pyবহিঃস্থ প্লাগইন বা মডিউল আমদানি করতে ব্যবহৃত হয়। নিম্নলিখিত গ্লোবাল ভেরিয়েবলটি সংজ্ঞায়িত করে পাইস্টেষ্ট মডিউলটি লোড করবে এবং এটি এর পরীক্ষার জন্য উপলব্ধ করবে। প্লাগইনগুলি সাধারণত আপনার প্রকল্পে বা অন্যান্য মডিউলগুলিতে সংজ্ঞায়িত ফাইল যা আপনার পরীক্ষায় প্রয়োজন হতে পারে। এখানে বর্ণিত হিসাবে আপনি পূর্বনির্ধারিত প্লাগইনগুলির একটি সেটও লোড করতে পারেন ।

    pytest_plugins = "someapp.someplugin"

  • হুকস : আপনি সেট আপ এবং টিয়ারডাউন পদ্ধতি এবং আপনার পরীক্ষার উন্নতির জন্য আরও অনেক কিছু যেমন হুক নির্দিষ্ট করতে পারেন। উপলব্ধ হুকগুলির একটি সেট জন্য, এখানে পড়ুন । উদাহরণ:

    def pytest_runtest_setup(item):
         """ called before ``pytest_runtest_call(item). """
         #do some stuff`
  • পরীক্ষার মূল পাথ : এটি কিছুটা গোপন বৈশিষ্ট্য। সংজ্ঞায়িত করে conftest.pyআপনার মূল পাথ তোমাকে থাকতে দিবে pytestউল্লেখ না করে আপনার আবেদন মডিউল স্বীকৃতি PYTHONPATH। ব্যাকগ্রাউন্ডে, পাইস্টেস্ট sys.pathসমস্ত মূল মডেলগুলি অন্তর্ভুক্ত করে আপনার পরিবর্তিত করে যা মূল পথ থেকে পাওয়া যায়।

আমি কি একাধিক কনটেস্ট.পি ফাইল রাখতে পারি?

হ্যাঁ আপনি করতে পারেন এবং যদি আপনার পরীক্ষার কাঠামোটি কিছুটা জটিল হয় তবে তা দৃ strongly়ভাবে সুপারিশ করা হয়। conftest.pyফাইলগুলির ডিরেক্টরি করার সুযোগ রয়েছে। সুতরাং, লক্ষ্যযুক্ত ফিক্সচার এবং সহায়তাকারী তৈরি করা ভাল অনুশীলন।

আমি কখন এটা করতে চাই? উদাহরণগুলি প্রশংসা করা হবে।

বেশ কয়েকটি কেস ফিট করতে পারে:

নির্দিষ্ট গ্রুপের পরীক্ষার জন্য সরঞ্জাম বা হুকের সেট তৈরি করা ।

রুট / গেলিক ভাষার / conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff


test root/mod2/test.py will NOT produce "I am mod"

কিছু পরীক্ষার জন্য ফিক্সচারের সেট লোড করা হচ্ছে তবে অন্যদের জন্য নয়।

রুট / গেলিক ভাষার / conftest.py

@pytest.fixture()
def fixture():
    return "some stuff"

রুট / mod2 / conftest.py

@pytest.fixture()
def fixture():
    return "some other stuff"

রুট / mod2 / test.py

def test(fixture):
    print(fixture)

"কিছু অন্যান্য জিনিস" মুদ্রণ করবে।

ওভাররাইডিং হুকগুলি মূল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত conftest.py

রুট / গেলিক ভাষার / conftest.py

def pytest_runtest_setup(item):
    print("I am mod")
    #do some stuff

রুট / conftest.py

def pytest_runtest_setup(item):
    print("I am root")
    #do some stuff

ভিতরে কোনও পরীক্ষা চালিয়ে root/mod, কেবল "আমি মোড" মুদ্রিত হয়।

আপনি conftest.py এখানে আরও পড়তে পারেন ।

সম্পাদনা করুন:

আমার যদি সরল-পুরাতন সাহায্যকারী ফাংশনগুলির প্রয়োজন হয় বিভিন্ন মডিউলটিতে বেশ কয়েকটি পরীক্ষা থেকে কল করার জন্য - যদি আমি সেগুলি একটি কন্টেস্ট.পিতে রাখি তবে সেগুলি কি আমার কাছে উপস্থিত হবে? বা আমি কি কেবল তাদের হেল্পার্স.পি মডিউলে রেখে এটিকে আমদানি করে আমার পরীক্ষার মডিউলগুলিতে ব্যবহার করব?

আপনি conftest.pyআপনার সাহায্যকারীদের সংজ্ঞায়িত করতে ব্যবহার করতে পারেন । যাইহোক, আপনার সাধারণ অভ্যাসটি অনুসরণ করা উচিত। হেল্পার্স কমপক্ষে ফিক্সচার হিসাবে ব্যবহার করা যেতে পারে pytest। উদাহরণস্বরূপ আমার পরীক্ষাগুলিতে আমার কাছে একটি মক রেডিস হেল্পার রয়েছে যা আমি এইভাবে আমার পরীক্ষাগুলিতে ইনজেক্ট করি।

রুট / সাহায্যকারী / redis / redis.py

@pytest.fixture
def mock_redis():
    return MockRedis()

রুট / পরীক্ষার / কাপড় / conftest.py

pytest_plugin="helper.redis.redis"

রুট / পরীক্ষার / কাপড় / test.py

def test(mock_redis):
    print(mock_redis.get('stuff'))

এটি একটি পরীক্ষা মডিউল হবে যা আপনি নির্দ্বিধায় আপনার পরীক্ষায় আমদানি করতে পারেন। উল্লেখ্য আপনি সম্ভাব্য নাম পারে যে redis.pyযেমন conftest.pyযদি আপনার মডিউল redisআরো পরীক্ষা রয়েছে। তবে অস্পষ্টতার কারণে সেই অনুশীলনকে নিরুৎসাহিত করা হয়।

আপনি যদি ব্যবহার করতে চান তবে আপনি conftest.pyসহজেই সেই সহায়কটিকে আপনার মূলের মধ্যে রাখতে পারেন conftest.pyএবং প্রয়োজনে এটি ইনজেকশন করতে পারেন।

রুট / পরীক্ষার / conftest.py

@pytest.fixture
def mock_redis():
    return MockRedis()

রুট / পরীক্ষার / কাপড় / test.py

def test(mock_redis):
    print(mock_redis.get(stuff))

আর একটি জিনিস আপনি যা করতে পারেন তা হ'ল একটি ইনস্টলযোগ্য প্লাগইন লিখুন। সেক্ষেত্রে আপনার সহায়কটি যে কোনও জায়গায় লেখা যেতে পারে তবে আপনার এবং অন্যান্য সম্ভাব্য পরীক্ষার ফ্রেমওয়ার্কগুলিতে ইনস্টল করার জন্য এন্ট্রি পয়েন্টটি নির্ধারণ করা দরকার। এই দেখুন ।

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

রুট / পরীক্ষার / সাহায্যকারী / redis.py

class MockRedis():
    # stuff

রুট / পরীক্ষার / কাপড় / test.py

from helper.redis import MockRedis

def test():
    print(MockRedis().get(stuff))

তবে, এখানে আপনার পাথ নিয়ে সমস্যা হতে পারে যেহেতু মডিউলটি পরীক্ষার চাইল্ড ফোল্ডারে নেই। __init__.pyআপনার সাহায্যকারীকে একটি যোগ করে আপনার এটিকে (পরীক্ষিত নয়) কাটিয়ে উঠতে সক্ষম হওয়া উচিত

রুট / পরীক্ষার / সাহায্যকারী / __ init__.py

from .redis import MockRedis

বা কেবল আপনার সহায়ক সহায়ক মডিউল যোগ করুন PYTHONPATH


আমি এমন পরিস্থিতির মুখোমুখি হচ্ছি যেখানে আমার প্রথম ইউনিট পরীক্ষার মডিউলটি ফিক্সচার সেটআপটি শেষ হওয়ার আগেইtest_aaaaa.py চালানোর চেষ্টা করছে । কেন এমন হতে পারে এমন কোনও চিন্তা? conftest.py
ব্যবহারকারী 9074332

কন্টেস্ট.পি ব্যতীত আপনার পরীক্ষার মূল পাথটি sys.path এ যোগ হবে না এবং আপনি "ModuleNotFoundError: 'foobar' নামক কোনও মডিউল" এর মতো ত্রুটি দেখতে পাবেন।
ক্যাল সুইনি

10

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


10

আমি conftest.pyআমার পরীক্ষাগুলিতে যে ফিক্সচারগুলি ইনজেক্ট করি তার সংজ্ঞা দিতে আমি ফাইলটি ব্যবহার করি, এটি কি সঠিক ব্যবহার conftest.py?

হ্যাঁ , একটি ফিক্সচার সাধারণত একাধিক পরীক্ষার জন্য ডেটা প্রস্তুত করতে ব্যবহৃত হয়।

এর অন্যান্য ব্যবহার আছে কি?

হ্যাঁ , একটি ফিক্সচার এমন একটি ফাংশন যা pytestআগে চালিত হয় এবং কখনও কখনও পরে আসল পরীক্ষার কাজ করে। ফিক্সের কোডটি আপনি যা চান তা করতে পারে। উদাহরণস্বরূপ, টেস্টগুলি কাজ করার জন্য কোনও ফিক্সচার ডেটা সেট করতে ব্যবহার করা যেতে পারে, বা কোনও ফিক্সচারটি পরীক্ষা চালানোর আগে কোনও সিস্টেমকে একটি পরিচিত অবস্থায় প্রবেশ করতে ব্যবহার করা যেতে পারে।

আমি কি একাধিক conftest.pyফাইল রাখতে পারি ? আমি কখন এটা করতে চাই?

প্রথমত, পৃথক পরীক্ষার ফাইলগুলিতে ফিক্সচারগুলি স্থাপন করা সম্ভব। তবে একাধিক পরীক্ষার ফাইলগুলির মধ্যে ফিক্সচারগুলি ভাগ করে নেওয়ার conftest.pyজন্য আপনাকে সমস্ত পরীক্ষার জন্য কেন্দ্রীয়ভাবে কোথাও অবস্থিত একটি ফাইল ব্যবহার করতে হবে । যেকোন পরীক্ষার মাধ্যমে ফিক্সচারগুলি ভাগ করা যায়। যদি আপনি চান যে কেবল সেই ফাইলটির পরীক্ষাগুলির মাধ্যমে ফিক্সচারটি ব্যবহার করা যেতে পারে তবে সেগুলি পৃথক পরীক্ষার ফাইলগুলিতে রাখা যেতে পারে।

দ্বিতীয়, হ্যাঁ , আপনি অন্য থাকতে পারেconftest.py উপরের টেস্ট ডিরেক্টরিগুলির উপ-ডিরেক্টরিতে ফাইল । যদি আপনি তা করেন তবে এই নিম্ন-স্তরের conftest.pyফাইলগুলিতে সংজ্ঞায়িত ফিক্সচারগুলি সেই ডিরেক্টরি এবং সাব ডিরেক্টরি ডিরেক্টরিতে পরীক্ষার জন্য উপলব্ধ থাকবে।

পরিশেষে, conftest.pyপরীক্ষার রুটে ফাইলটিতে ফিক্সচারগুলি রাখলে তা সমস্ত পরীক্ষার ফাইলে উপলব্ধ হবে।

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