পাইথন ইউনিট পরীক্ষাগুলি কোথায় যায়?


490

আপনি যদি একটি গ্রন্থাগার বা একটি অ্যাপ লিখছেন তবে ইউনিট পরীক্ষার ফাইলগুলি কোথায় যাবে?

পরীক্ষার ফাইলগুলি মূল অ্যাপ্লিকেশন কোড থেকে পৃথক করা ভাল, তবে অ্যাপ্লিকেশন রুট ডিরেক্টরিটির ভিতরে "পরীক্ষার" উপ-ডিরেক্টরিতে এগুলি স্থাপন করা বিশ্রী কারণ, আপনি যে মডিউলগুলি পরীক্ষা করছেন এটি আমদানি করা আরও শক্ত করে তোলে।

এখানে কি সেরা অনুশীলন আছে?


4
এই প্রশ্নের অনেক গ্রহণযোগ্য উত্তর রয়েছে এবং এটি Q / A সাইটের জন্য প্রশ্ন নয়। লোকেরা বুঝতে হবে যে সমস্ত দুর্দান্ত সহায়ক প্রশ্ন এসও তে জিজ্ঞাসা করা যায় না। ফর্মাররা এটির জন্য চয়ন করে এবং আমাদের অবশ্যই তাদের বিধি অনুসরণ করতে হবে।
ওয়াউটার জে

121
লোকেরা এও বুঝতে হবে যে যখন এসও পৃষ্ঠাগুলি গুগল অনুসন্ধানের শীর্ষে পরিণত হয়, তখন সম্ভবত সরকারী মতবাদকে আটকে না রেখে কেবল প্রবাহের সাথে চলে যাওয়া ভাল is
ক্রিস্টোফার বারবার

6
@ ক্রিস্টোফারবার্বার লোকেদেরও বুঝতে হবে যে সিদ্ধান্ত এবং আক্রমণাত্মক সমাপ্তি হ'ল এমন সাইট হিসাবে আমি এত ভয়াবহ খ্যাতি অর্জন করতে পেরেছি, যদি না সত্যিই আমার কাছে আরও ভাল বিকল্প না থাকে তবে আমি প্রশ্ন জিজ্ঞাসা করতে যাব না।
স্টেফানো বোরিনি

উত্তর:


200

একটি ফাইলের জন্য module.py, ইউনিট পরীক্ষাটি সাধারণত কল করা উচিতtest_module.py পাইথোনিক নামকরণের কনভেনশন অনুসরণ ।

রাখার জন্য বেশ কয়েকটি সাধারণভাবে গৃহীত স্থান রয়েছে test_module.py:

  1. একই ডিরেক্টরিতে module.py
  2. ভিতরে ../tests/test_module.py (কোড ডিরেক্টরি হিসাবে একই স্তরের)।
  3. ইন tests/test_module.py(কোড ডিরেক্টরিতে একটি স্তর)।

আমি পরীক্ষাগুলি সন্ধান এবং সেগুলি আমদানি করার সরলতার জন্য # 1 পছন্দ করি। আপনি যে বিল্ড সিস্টেম ব্যবহার করছেন তা সহজেই ফাইলগুলি চালনার জন্য কনফিগার করা যায় test_। আসলে, পরীক্ষার আবিষ্কারের জন্য ব্যবহৃত ডিফল্ট unittestপ্যাটার্নটিtest*.py


12
Load_tests প্রোটোকল ডিফল্টরূপে পরীক্ষা * .py নামে ফাইলের জন্য অনুসন্ধান। এছাড়াও, শীর্ষস্থানীয় গুগল ফলাফল এবং এই একক ডকুমেন্টেশন উভয়ই টেস্ট_মডিউল.পি ফর্ম্যাট ব্যবহার করে।
dfarrell07

6
Foo_test.py ব্যবহার করা ট্যাব-সমাপ্তি ব্যবহার করার সময় একটি কী-স্ট্রোক বা দুটি বাঁচাতে পারে যেহেতু আপনার কাছে 'টেস্ট_' দিয়ে শুরু হওয়া কোনও ফাইল নেই।
জুনিপার-

11
@ জুনিপার, আপনার কোডিংয়ের সময় আপনার চিন্তাধারার মডিউল_টেষ্টগুলি স্বয়ংক্রিয়ভাবে সমাপ্তিতে উপস্থিত হবে। এটি বিভ্রান্তিকর বা বিরক্তিকর হতে পারে।
মেডিইরোস

11
কোড স্থাপন করার সময়, আমরা আমাদের উত্পাদন স্থানে পরীক্ষা স্থাপন করতে চাই না। সুতরাং, যখন আমরা মোতায়েন করি তখন এগুলি একটি ডিরেক্টরিতে './tests/test_blah.py' রাখা ইয়াঙ্ক করা সহজ। এছাড়াও, কিছু পরীক্ষাগুলি নমুনা ডেটা ফাইল নেয় এবং টেস্ট ডিরেক্টরিতে সেগুলি থাকা অত্যাবশ্যক যাতে আমরা পরীক্ষার ডেটা স্থাপন করি না।
কেভিন জে রাইস

1
@ কেভিনজে.আরাইস আপনি কি পরীক্ষা করছেন না যে কোডটি আপনার উত্পাদন অবস্থানগুলিতে কাজ করে?
এন্ডোলিথ

67

মাত্র 1 টি পরীক্ষা ফাইল

যদি কেবলমাত্র 1 টি পরীক্ষা ফাইল থাকে তবে এটি একটি শীর্ষ-স্তরের ডিরেক্টরিতে রাখার প্রস্তাব দেওয়া হয়:

module/
    lib/
        __init__.py
        module.py
    test.py

সিএলআই-তে পরীক্ষা চালান

python test.py

অনেক পরীক্ষার ফাইল

যদি অনেক পরীক্ষার ফাইল থাকে তবে এটি একটি testsফোল্ডারে রাখুন:

module/
    lib/
        __init__.py
        module.py
    tests/
        test_module.py
        test_module_function.py
# test_module.py

import unittest
from lib import module

class TestModule(unittest.TestCase):
    def test_module(self):
        pass

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

সিএলআই-তে পরীক্ষা চালান

# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function

ব্যবহার unittest discovery

unittest discovery প্যাকেজ ফোল্ডারে সমস্ত পরীক্ষা খুঁজে পাবেন।

একটি তৈরি করুন __init__.pyমধ্যে tests/ফোল্ডারের

module/
    lib/
        __init__.py
        module.py
    tests/
        __init__.py
        test_module.py
        test_module_function.py

সিএলআই-তে পরীক্ষা চালান

# In top-level /module/ folder

# -s, --start-directory (default current directory)
# -p, --pattern (default test*.py)

python -m unittest discover

উল্লেখ

ইউনিট পরীক্ষার কাঠামো


51

একটি সাধারণ অনুশীলন হ'ল পরীক্ষাগুলি ডিরেক্টরিটিকে আপনার মডিউল / প্যাকেজ হিসাবে একই প্যারেন্ট ডিরেক্টরিতে রেখে দেওয়া। সুতরাং যদি আপনার মডিউলটিকে foo.py বলা হয় তবে আপনার ডিরেক্টরি বিন্যাসটি দেখতে দেখতে এমন হবে:

parent_dir/
  foo.py
  tests/

অবশ্যই এটি করার কোনও উপায় নেই। আপনি একটি পরীক্ষার সাবডিরেক্টরিও তৈরি করতে পারেন এবং পরম আমদানি ব্যবহার করে মডিউলটি আমদানি করতে পারেন

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


16
আমি এটি করতে চাই তবে আমি এটি কাজ করতে পারি না। পরীক্ষা চালানোর জন্য, আমি প্যারেন্ট_ডায়ারে আছি এবং টাইপ করুন: "পাইথন টেস্টস \ foo_test.py", এবং foo_test.py এ: "থেকে ..foo এটিকে আমদানি করুন, থিওথর" যা এতে ব্যর্থ: "মান মূল্য: চেষ্টা করা হয়েছে" নন-প্যাকেজগুলিতে আপেক্ষিক আমদানি "প্যারেন্ট_ডির এবং পরীক্ষাগুলির উভয়েই তাদের মধ্যে একটি init .py রয়েছে, সুতরাং তারা কেন প্যাকেজ নয় তা আমি নিশ্চিত নই। আমি সন্দেহ কারণ টপ লেভেল স্ক্রিপ্ট কমান্ড লাইন থেকে চালানো (অংশ) একটি প্যাকেজ বিবেচিত করা যাবে না এটি, এমনকি যদি এটি একটি সঙ্গে একটি Dir এর Init .py। তাহলে আমি কীভাবে পরীক্ষা চালাব? আমি আজ উইন্ডোজে কাজ করছি, আমার সুতির মোজা দোয়া করুন।
জোনাথন হার্টলি

4
সবচেয়ে ভাল উপায় - আমি খুঁজে পেয়েছি - ইউনিট পরীক্ষা চালানোর জন্য হ'ল আপনার গ্রন্থাগার / প্রোগ্রাম ইনস্টল করা তারপরে নাক দিয়ে ইউনিট পরীক্ষা চালানো। এটিকে আরও সহজ করার জন্য আমি ভার্চুয়ালেনভ এবং ভার্চুয়ালেনভ্রাপারকে সুপারিশ করব।
ক্রিশ্চিয়ান

@ টার্টলি - অবসান আমদানি কাজ করার জন্য আপনার 'টেস্ট' ডিরেক্টরিতে আপনার একটি init .py ফাইলের প্রয়োজন । আমার এই পদ্ধতিটি নাক দিয়ে কাজ করছে, তাই আপনি কেন সমস্যা করছেন তা নিশ্চিত নই।
সেএমসিগিন্টি

4
ধন্যবাদ ক্যাসি - কিন্তু আমি একজন আছে Init সমস্ত প্রাসঙ্গিক ডিরেক্টরিগুলি থেকে .py ফাইল। আমি কী ভুল করি তা আমি জানি না, তবে আমার সমস্ত পাইথন প্রকল্পগুলিতে আমার এই সমস্যা রয়েছে এবং অন্য কেউ কেন করেন না তা আমি বুঝতে পারি না। ওরে ডায়রি
জোনাথন হার্টলি

8
পাইথন 2 .6 বা আরও নতুন দিয়ে আমার সমস্যার সমাধান করুন, আপনার প্রকল্পের মূল থেকে পরীক্ষাগুলি চালাতে আমাদের ব্যবহার করুন: পাইথন-মি প্রকল্প.প্যাকেজ.সেটস.মডিউল_টেসেটস (পাইথন প্রজেক্ট / প্যাকেজ / টেস্টস / মডিউল_টেস.পি এর পরিবর্তে) । এটি পরীক্ষার মডিউলটির ডিরেক্টরিটিকে পথে রাখে, তাই পরীক্ষাগুলি মডিউল-আন্ডার-পরীক্ষা পাওয়ার জন্য তাদের পিতামাতার ডিরেক্টরিতে একটি আপেক্ষিক আমদানি করতে পারে।
জোনাথন হার্টলি

32

পাইথোস্কোপ ( https://pypi.org/project/pythoscope/ ) লেখার সময় আমাদের কাছে একই প্রশ্ন ছিল যা পাইথন প্রোগ্রামগুলির ইউনিট পরীক্ষা উত্পন্ন করে। আমরা ডিরেক্টরি বাছাই করার আগে অজগর তালিকায় মানুষকে পরীক্ষার জন্য পোল করেছিলাম, সেখানে বিভিন্ন মতামত ছিল। শেষ পর্যন্ত আমরা উত্স কোড হিসাবে একই ডিরেক্টরিতে একটি "পরীক্ষা" ডিরেক্টরি স্থাপন করা বেছে নিয়েছি। সেই ডিরেক্টরিতে আমরা পিতামাতার ডিরেক্টরিতে প্রতিটি মডিউলের জন্য একটি পরীক্ষা ফাইল তৈরি করি।


2
অসাধারণ! কিছু লিগ্যাসি কোডে কেবল পাইথোস্কোপ (দুর্দান্ত লোগো) চালিয়েছেন এবং এটি আশ্চর্যজনক। তাত্ক্ষণিক সেরা অনুশীলনগুলি এবং আপনি এখন অন্যান্য ব্যর্থদের এখন ব্যর্থ টেস্ট স্টাবগুলি পূরণ করতে পারেন। এখন এটাকে বাঁশ দিয়ে? :)
উইল

27

আমি জেরেমি ক্যান্ট্রেল নোটের উপরে যেমন ফাইলগুলিতে আমার ইউনিট টেস্টগুলি রাখার ঝোঁক রাখি, যদিও আমি পরীক্ষার ফাংশনটি মূল দেহে রাখি না, বরং সমস্ত কিছু একটিতে রেখেছি

if __name__ == '__main__':
   do tests...

ব্লক। এটি আপনি পরীক্ষা করছেন পাইথন ফাইলটি কীভাবে ব্যবহার করবেন সেটির জন্য 'উদাহরণ কোড' হিসাবে ফাইলটিতে ডকুমেন্টেশন যুক্ত করে এটি শেষ হয়।

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

if __name__ == '__main__':
   import tests.thisModule
   tests.thisModule.runtests

এটি আপনার উত্স কোডটি পড়া যে কাউকে পরীক্ষা কোডটি কোথায় সন্ধান করতে দেয় তা জানতে দেয়।


"জেরেমি কেন্ট্রেল যেমন নোটের উপরে" কোথায়?
এন্ডোলিথ

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

19

প্রতি একবারে আমি নিজেকে পরীক্ষার স্থান নির্ধারণের বিষয়টি যাচাই করে দেখি এবং প্রতিবারই সংখ্যাগরিষ্ঠরা লাইব্রেরি কোডের পাশে পৃথক ফোল্ডার কাঠামোর প্রস্তাব দেয় তবে আমি দেখতে পেলাম যে প্রত্যেকবার যুক্তিগুলি একই রকম এবং এটি দৃinc়প্রত্যয়ী নয়। আমি আমার মডিউলগুলি মূল মডিউলগুলির পাশে কোথাও রেখেছি।

এটি করার প্রধান কারণ হ'ল রিফ্যাক্টরিং

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

আপনার নিজের জিজ্ঞাসা করা উচিত প্রধান প্রশ্ন:

আমি কি লিখছি:

  • ক) পুনরায় ব্যবহারযোগ্য গ্রন্থাগার বা
  • খ) কিছু আধা-পৃথক পৃথক মডিউল একসাথে বান্ডিল করার চেয়ে একটি প্রকল্প তৈরি করা?

যদি একটি:

একটি পৃথক ফোল্ডার এবং এর কাঠামো বজায় রাখার অতিরিক্ত প্রচেষ্টা আরও উপযুক্ত হতে পারে। আপনার পরীক্ষাগুলি উত্পাদনে নিযুক্ত হওয়ার বিষয়ে কেউ অভিযোগ করবে না ।

তবে টেস্টগুলি মূল ফোল্ডারগুলির সাথে মিশ্রিত হওয়ার পরে বিতরণ করা থেকে বাদ দেওয়া ঠিক তত সহজ; সেটআপ.পাইতে এটি রাখুন :

find_packages("src", exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) 

যদি খ:

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

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

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


1
উত্পাদনে পরীক্ষার স্থাপনের সমস্যা আসলে কী? আমার অভিজ্ঞতাতে এটি খুব দরকারী: ব্যবহারকারীদের তাদের পরিবেশের উপর পরীক্ষা চালানোর অনুমতি দেয় ... আপনি যখন বাগ রিপোর্ট পাবেন, আপনি সেখানে পরীক্ষার স্যুটটি চালানোর জন্য ব্যবহারকারীকে সেখানে সবকিছু ঠিক আছে কিনা তা নিশ্চিত করতে এবং পরীক্ষার জন্য গরম প্যাচগুলি প্রেরণ করতে পারেন স্যুট সরাসরি ... ব্যতীত, তাই না কারণ আপনার module.tests আপনার পরীক্ষার করা এটাই হবে উৎপাদনে শেষ, যদি না আপনি আপনার সেটআপ ফাইলে কিছু ভুল করেনি ...
anarcat

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

15

আমি একটি tests/ডিরেক্টরি ব্যবহার করি এবং তারপরে আপেক্ষিক আমদানি ব্যবহার করে মূল অ্যাপ্লিকেশন মডিউলগুলি আমদানি করি। সুতরাং মাই অ্যাপ / পরীক্ষা / foo.py এ, এখানে থাকতে পারে:

from .. import foo

MyApp.fooমডিউলটি আমদানি করতে ।


5
"মানমূল: অ প্যাকেজে আপেক্ষিক আমদানির চেষ্টা করা হয়েছে"
সিআরপিএন

12

আমি বিশ্বাস করি না একটি প্রতিষ্ঠিত "সেরা অনুশীলন" আছে।

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


3
আমি তারপরে sys.path-মূল অ্যাপ্লিকেশন ডিরেক্টরিটি যুক্ত করি সমস্যাটি হ'ল যদি আপনার পরীক্ষাগুলিতে কিছু সহায়ক মডিউল থাকে (যেমন টেস্ট ওয়েব সার্ভার) এবং আপনার যথাযথ পরীক্ষার মধ্যে থেকে আপনাকে এই জাতীয় সহায়ক মডিউলগুলি আমদানি করতে হবে।
পাইওটর ডব্রোগোস্ট

এটি আমার কাছে দেখতে দেখতে এটি হ'ল:os.sys.path.append(os.dirname('..'))
ম্যাট এম।

11

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

                              <Main Package>
                               /          \
                              /            \
                            lib           tests
                            /                \
             [module1.py, module2.py,  [ut_module1.py, ut_module2.py,
              module3.py  module4.py,   ut_module3.py, ut_module.py]
              __init__.py]

এইভাবে আপনি যখন কোনও আরপিএম ব্যবহার করে এই লাইব্রেরিগুলি প্যাকেজ করেন, আপনি কেবল প্রধান লাইব্রেরি মডিউলগুলি প্যাকেজ করতে পারেন (কেবল)। এটি বিশেষত চৌকস পরিবেশে রক্ষণাবেক্ষণে সহায়তা করে।


1
আমি বুঝতে পেরেছি যে এই পদ্ধতির একটি সম্ভাব্য সুবিধা হ'ল পরীক্ষাগুলি তাদের নিজস্ব একটি স্বাধীন প্রয়োগ হিসাবে (এবং এমনকি সংস্করণ দ্বারা নিয়ন্ত্রিত) বিকাশ করা যেতে পারে। অবশ্যই, প্রতিটি সুবিধার জন্য একটি অসুবিধা রয়েছে - প্রতিসাম্যতা বজায় রাখা মূলত "ডাবল এন্ট্রি অ্যাকাউন্টিং" করে এবং একটি কাজকর্মকে আরও বেশি সংশোধন করে তোলে।
জশা

নরম অনুসরন প্রশ্ন: কেন চৌকস পরিবেশ বিশেষত এই পদ্ধতির জন্য উপযুক্ত? (অর্থাত্ চটপট ওয়ার্কফ্লো সম্পর্কে কি একটি প্রতিসম ডিরেক্টরি কাঠামো এত উপকারী হয়?)
জশা

11

আমি আপনাকে গিটহাবের মূল পাইথন প্রকল্পগুলি পরীক্ষা করে কিছু ধারণা নেওয়ার পরামর্শ দিচ্ছি।

যখন আপনার কোডটি বৃহত্তর হয়ে যায় এবং আপনি আরও লাইব্রেরি যুক্ত করেন আপনার একই ডিরেক্টরিতে সেটআপ.পি রয়েছে এমন একটি পরীক্ষার ফোল্ডার তৈরি করা ভাল এবং প্রতিটি পরীক্ষার ধরণের জন্য আপনার প্রকল্প ডিরেক্টরি কাঠামোটি আয়না করে দেওয়া (ইউনিটেস্ট, সংহতকরণ, ...)

উদাহরণস্বরূপ যদি আপনার কাছে ডিরেক্টরি কাঠামো থাকে যেমন:

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
setup.py

পরীক্ষার ফোল্ডার যুক্ত করার পরে আপনার মতো ডিরেক্টরি কাঠামো থাকবে:

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
test/
   unit/
      myapp/
         moduleA/
            module_A_test.py
         moduleB/
            module_B_test.py
   integration/
          myapp/
             moduleA/
                module_A_test.py
             moduleB/
                module_B_test.py
setup.py

অনেকগুলি যথাযথভাবে লিখিত পাইথন প্যাকেজগুলি একই কাঠামো ব্যবহার করে। খুব ভাল উদাহরণ বোটো প্যাকেজ। পরীক্ষা করে দেখুন https://github.com/boto/boto


1
"পরীক্ষা" এর পরিবর্তে "পরীক্ষা" ব্যবহার করার পরামর্শ দেওয়া হয়, কারণ "পরীক্ষা" মডিউলে পাইথন বিল্ড। docs.python.org/2/library/test.html
brodul

সর্বদা নয় .. উদাহরণস্বরূপ matplotlibএটি matplotlib/lib/matplotlib/tests( github.com/matplotlib/matplotlib/tree/… ) এর sklearnঅধীনে রয়েছে , এটি scikitelearn/sklearn/tests( github.com/scikit-learn/scikit-learn/tree/master/sklearn/tests )
আলফা_989

7

আমি কিভাবে এটি ...

ফোল্ডার কাঠামো:

project/
    src/
        code.py
    tests/
    setup.py

সেটআপ.পিটি আমার প্রকল্পের মডিউলগুলি যুক্ত স্থান হিসাবে এসআরসি / তে পয়েন্ট করে, তারপরে আমি চালিত করি:

setup.py develop

যা আমার প্রকল্পের সাইটের অনুলিপিটিকে নির্দেশ করে সাইট-প্যাকেজে আমার প্রকল্প যুক্ত করে my আমার পরীক্ষা চালানোর জন্য আমি ব্যবহার করি:

setup.py tests

যে কোনও পরীক্ষা রানারকে আমি কনফিগার করেছি ব্যবহার করে।


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

4

আমি টপলেভেল টেস্ট ডিরেক্টরি পছন্দ করি। এর অর্থ এই নয় যে আমদানিগুলি আরও কিছুটা কঠিন হয়ে যায়। তার জন্য আমার দুটি সমাধান রয়েছে:

  1. সেটআপলগুলি ব্যবহার করুন। তারপর আপনি পাস করতে পারেন test_suite='tests.runalltests.suite'মধ্যে setup(), এবং কেবল পরীক্ষার চালাতে পারেন:python setup.py test
  2. পরীক্ষা চালানোর সময় পাইথনপথ সেট করুন: PYTHONPATH=. python tests/runalltests.py

এম 2 ক্রাইপ্টো-তে কীভাবে সেই স্টাফ কোড দ্বারা সমর্থিত তা এখানে:

আপনি যদি নাকের নাক দিয়ে পরীক্ষা চালানো পছন্দ করেন তবে আপনার কিছুটা আলাদা করার দরকার হতে পারে।


3

আমরা ব্যাবহার করি

app/src/code.py
app/testing/code_test.py 
app/docs/..

প্রতিটি পরীক্ষার ফাইল আমরা সন্নিবেশ ../src/মধ্যে sys.path। এটি সর্বোত্তম সমাধান নয় তবে কাজ করে। আমি মনে করি যে কেউ যদি জাভাতে ডাব্লু / ম্যাভেনের মতো কিছু নিয়ে আসে যা আপনাকে স্ট্যান্ডার্ড কনভেনশন দেয় যা ঠিক কাজ করে, আপনি যে প্রকল্পে কাজ করেন তা বিবেচনা করে না।


1

যদি পরীক্ষাগুলি সহজ হয়, কেবল তাদের ডক্ট্রিংয়ে রাখুন - পাইথনের বেশিরভাগ টেস্ট ফ্রেমওয়ার্কগুলি এটি ব্যবহার করতে সক্ষম হবে:

>>> import module
>>> module.method('test')
'testresult'

অন্যান্য জড়িত পরীক্ষাগুলির জন্য, আমি সেগুলিকে ভিতরে ../tests/test_module.pyবা ভিতরে রাখতাম tests/test_module.py


1

সি # তে, আমি সাধারণত পরীক্ষাগুলি একটি পৃথক সমাবেশে পৃথক করি।

পাইথনে - এখনও অবধি - আমি হয় নথির লেখার প্রবণতা করেছি, যেখানে পরীক্ষা কোনও ফাংশনের ডক্ট্রিংয়ে থাকে, বা এগুলি if __name__ == "__main__"মডিউলটির নীচে ব্লকে রেখে দেয়।


0

"Foo" নামে একটি প্যাকেজ লেখার সময়, আমি ইউনিট টেস্টগুলি একটি পৃথক প্যাকেজ "foo_test" তে রাখব। মডিউল এবং সাবপ্যাকেজগুলি এরপরে SUT প্যাকেজ মডিউলটির একই নাম থাকবে। উদাহরণস্বরূপ foo.test.xy জন্য একটি মডিউল foo.xy পরীক্ষা করা হয় প্রতিটি পরীক্ষার প্যাকেজের __init__.py ফাইলগুলি পরে প্যাকেজের সমস্ত পরীক্ষার স্যুট অন্তর্ভুক্ত একটি অলটেষ্ট স্যুট থাকে। সেটআপলগুলি মূল পরীক্ষার প্যাকেজ নির্দিষ্ট করার জন্য একটি সুবিধাজনক উপায় সরবরাহ করে, যাতে "পাইথন সেটআপ.পিপি বিকাশ" এর পরে আপনি কেবল "পাইথন সেটআপ.পি টেস্ট" বা "পাইথন সেটআপ.পি পরীক্ষা -s foo_test.x.SomeTestSuite" ব্যবহার করতে পারেন একটি নির্দিষ্ট স্যুট।


0

আমি পরীক্ষার অধীনে কোড (সিটি) হিসাবে একই ডিরেক্টরিতে আমার পরীক্ষাগুলি রেখেছি; জন্য foo.pyপরীক্ষা হবেfoo_ut.py বা অনুরূপ হবে। (আমি এটিগুলি আবিষ্কার করার জন্য পরীক্ষার আবিষ্কারের প্রক্রিয়াটি টুইঙ্ক করি))

এটি পরীক্ষাগুলি একটি ডিরেক্টরি তালিকার কোডের ঠিক পাশেই রাখে এবং পরীক্ষাগুলি রয়েছে তা স্পষ্ট করে তোলে এবং পরীক্ষাগুলি যতটা সহজ করে দেয় তত সহজেই সম্ভব হয় যখন তারা আলাদা কোনও ফাইলে থাকে। (কমান্ড লাইন সম্পাদকদের জন্য,vim foo* এবং গ্রাফিকাল ফাইল সিস্টেম ব্রাউজার ব্যবহার করার সময়, কেবল সিটি ফাইল এবং তারপরে তত্ক্ষণাত সংলগ্ন পরীক্ষা ফাইলটি ক্লিক করুন)

অন্যরা যেমন উল্লেখ করেছে , এটি পুনরায় চুলকানো সহজতর করে তোলে এবং অন্য কোথাও ব্যবহারের জন্য কোডটি বের করার পক্ষে এটি কখনও প্রয়োজন হওয়া উচিত।

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


-2

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

সুতরাং, আমার আছে:

অ্যাপ্লিকেশন /
 appfile.py
পরীক্ষা /
 appfileTest.py

আমি বড় প্রকল্পগুলিতে অগ্রগতির সাথে এটি কীভাবে হয় তা দেখতে হবে।


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