python - tutorial - সাধারণত পরীক্ষা ডিরেক্টরি গঠন সঙ্গে unittest চলমান




python wiki (13)

এমনকি একটি সাধারণ পাইথন মডিউলের জন্য খুব সাধারণ ডিরেক্টরি গঠন ইউনিট পরীক্ষাগুলিকে তাদের নিজস্ব test ডিরেক্টরিতে আলাদা করতে বলে মনে হচ্ছে:

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

উদাহরণস্বরূপ এই পাইথন প্রকল্প কিভাবে দেখুন।

আমার প্রশ্ন সহজভাবে পরীক্ষা চলমান স্বাভাবিক উপায় কি? আমি সন্দেহ করি এটি আমার ছাড়া অন্য সকলের জন্য সুস্পষ্ট, তবে আপনি কেবলমাত্র পরীক্ষামূলক ডিরেক্টরি থেকে python test_antigravity.py চালাতে পারবেন না কারণ এটির import antigravity ব্যর্থ হবে কারণ মডিউলটি পাথে নেই।

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

অন্য বিকল্পটি কেবলমাত্র অন্যান্য ফাইলের মধ্যে পরীক্ষা ফাইলটি অনুলিপি করা, তবে এটি একটি বিট মনে হয় এবং এটিতে শুরু করার জন্য আলাদা ডিরেক্টরিতে থাকার বিষয়টি বাদ দেয়।

সুতরাং, যদি আপনি আমার নতুন প্রকল্পের উত্সটি ডাউনলোড করে থাকেন তবে আপনি ইউনিট পরীক্ষাগুলি কীভাবে চালাতে পারবেন? আমি এমন একটি উত্তর পছন্দ করব যা আমাকে আমার ব্যবহারকারীদের বলবে: "ইউনিট পরীক্ষা চালানোর জন্য এক্স করুন।"


আসলে পরীক্ষা চলমান স্বাভাবিক উপায় কি

আমি পাইথন 3.6.2 ব্যবহার করি

cd new_project

pytest test/test_antigravity.py

ইনস্টল করার জন্য: sudo pip install pytest

আমি কোনও পাথ পরিবর্তনশীল সেট করি নি এবং আমার আমদানি একই "পরীক্ষামূলক" প্রকল্প কাঠামোর সাথে ব্যর্থ হয় না।

আমি এই if __name__ == '__main__' মন্তব্য করেছি: if __name__ == '__main__' এরকম হয়:

test_antigravity.py

import antigravity

class TestAntigravity(unittest.TestCase):

    def test_something(self):

        # ... test stuff here


# if __name__ == '__main__':
# 
#     if __package__ is None:
# 
#         import something
#         sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
#         from .. import antigravity
# 
#     else:
# 
#         from .. import antigravity
# 
#     unittest.main()

পাইথন 3+

@ পিয়ারে যোগ করা হচ্ছে

এই মত unittest ডিরেক্টরি গঠন ব্যবহার করে:

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

পরীক্ষা মডিউল চালানোর জন্য test_antigravity.py :

$ cd new_project
$ python -m unittest test.test_antigravity

অথবা একটি একক TestCase

$ python -m unittest test.test_antigravity.GravityTestCase

বাধ্যতামূলক __init__.py ভুলে গেলেও খালি থাকলে অন্যথায় কাজ করবে না।


আপনার যদি আপনার ডিরেক্টরির ডিরেক্টরির মধ্যে একাধিক ডিরেক্টরি থাকে, তবে আপনাকে প্রতিটি ডিরেক্টরিতে একটি __init__.py ফাইল যোগ করতে হবে।

/home/johndoe/snakeoil
└── test
    ├── __init__.py        
    └── frontend
        └── __init__.py
        └── test_foo.py
    └── backend
        └── __init__.py
        └── test_bar.py

তারপর একযোগে প্রতিটি পরীক্ষা চালানোর জন্য, চালান:

python -m unittest discover -s /home/johndoe/snakeoil/test -t /home/johndoe/snakeoil

উত্স: python -m unittest -h

  -s START, --start-directory START
                        Directory to start discovery ('.' default)
  -t TOP, --top-level-directory TOP
                        Top level directory of project (defaults to start
                        directory)

আপনি কিছু voodoo ছাড়া প্যারেন্ট ডিরেক্টরি থেকে আমদানি করতে পারবেন না। এখানে আরেকটি উপায় যা কমপক্ষে পাইথন 3.6 দিয়ে কাজ করে।

প্রথমে, নিম্নলিখিত সামগ্রী সহ একটি ফাইল পরীক্ষা / context.py আছে:

import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

তারপরে ফাইল পরীক্ষা / test_antigravity.py এ নিম্নলিখিত আমদানি করুন:

import unittest
try:
    import context
except ModuleNotFoundError:
    import test.context    
import antigravity

উল্লেখ্য যে এই চেষ্টা করার কারণটি ব্যতীত

  • "Python test_antigravity.py" এবং চালানোর সময় test.context আমদানি ব্যর্থ হয়
  • new_project ডিরেক্টরি থেকে "পাইথন-এম unittest" দিয়ে চালানোর সময় আমদানি প্রসঙ্গ ব্যর্থ হয়।

এই trickery সঙ্গে তারা উভয় কাজ।

এখন আপনি পরীক্ষার ডিরেক্টরির মধ্যে সব পরীক্ষা ফাইল সঙ্গে চালাতে পারেন:

$ pwd
/projects/new_project
$ python -m unittest

অথবা একটি পৃথক পরীক্ষা ফাইল চালান:

$ cd test
$ python test_antigravity

ঠিক আছে, test_antigravity.py- এর মধ্যে context.py এর বিষয়বস্তু থাকার চেয়ে এটি অনেক বেশি সুন্দর নয়, তবে হয়ত সামান্য। পরামর্শ স্বাগত জানাই।


আপনি লিঙ্ক নিবন্ধ থেকে:

Test_modulename.py ফাইলটি তৈরি করুন এবং আপনার একত্রিত পরীক্ষাগুলি এতে রাখুন। যেহেতু পরীক্ষা মডিউলগুলি আপনার কোড থেকে আলাদা ডিরেক্টরিতে রয়েছে, তাই আপনাকে তাদের পিউথনপ্যাটে আপনার মডিউলের প্যারেন্ট ডিরেক্টরিটি চালানোর জন্য এটির প্রয়োজন হতে পারে:

$ cd /path/to/googlemaps

$ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps

$ python test/test_googlemaps.py

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

সম্ভবত আপনি nose তাকান উচিত হিসাবে এটি সুপারিশ?


আপনি সত্যিই পাইপ টুল ব্যবহার করা উচিত।

উন্নয়ন মোডে আপনার প্যাকেজ ইনস্টল করার জন্য pip install -e ব্যবহার করুন। এটি একটি খুব ভাল অনুশীলন।

নীচের রেফারেল ইউআরএলটিতে, 2 ক্লাসিক প্রকল্প (পরীক্ষা সহ) লেআউট দেওয়া হয়, আপনি তাদের যে কোনও অনুসরণ করতে পারেন।

রেফারেন্স :


আমি একটি পৃথক ইউনিট পরীক্ষা ফোল্ডার সঙ্গে একই সমস্যা ছিল। উল্লিখিত পরামর্শগুলি থেকে আমি sys.path এর পরম উৎস পাথ যোগ sys.path

নিম্নোক্ত সমাধানটির সুবিধা হল, যে test/test_yourmodule.py test-directory মধ্যে প্রথম পরিবর্তন ছাড়াই ফাইল test/test_yourmodule.py চালাতে পারে:

import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))

import antigravity
import unittest

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

python -m unittest discover -s ../test

আপনি যদি আপনার প্রকল্প ডিরেক্টরির মধ্যে একটি ব্যাচ ফাইলে রাখতে চান তবে আপনি এটি করতে পারেন:

setlocal & cd src & python -m unittest discover -s ../test

এই বিএএসএইচ স্ক্রিপ্ট আপনার সিস্টেমে যে কোনও ডিরেক্টরী ডিরেক্টরি থাকা সত্ত্বেও ফাইল সিস্টেমে যে কোনও স্থান থেকে পাইথন একত্রিত পরীক্ষা ডিরেক্টরি চালাবে।

./src বা ./example ওয়ার্কিং ডিরেক্টরি থাকা ./src এটি ./src এবং আপনাকে একটি দ্রুত ইউনিট পরীক্ষা প্রয়োজন:

#!/bin/bash

this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

python -m unittest discover -s "$readlink"/test -v

কোনও test/__init__.py ফাইলের জন্য আপনার প্যাকেজ / মেমরি-ওভারহেড test/__init__.py জন্য কোনও প্রয়োজন নেই।


নিম্নলিখিত আমার প্রকল্প গঠন:

ProjectFolder:
 - project:
     - __init__.py
     - item.py
 - tests:
     - test_item.py

আমি setupUp () পদ্ধতিতে আমদানি করতে এটি আরও ভালভাবে খুঁজে পেয়েছি:

import unittest
import sys    

class ItemTest(unittest.TestCase):

    def setUp(self):
        sys.path.insert(0, "../project")
        from project import item
        # further setup using this import

    def test_item_props(self):
        # do my assertions

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

যদি আপনি "পাইথন setup.py বিকাশ" চালান তবে প্যাকেজটি পথের মধ্যে থাকবে। কিন্তু আপনি এটি করতে চাইবেন না কারণ আপনি আপনার সিস্টেম পাইথন ইনস্টলেশানটি সংক্রামিত করতে পারেন, যার জন্য buildout এবং buildout মতো সরঞ্জাম বিদ্যমান।


যদি আপনি কমান্ড লাইন-কেবল সমাধান খুঁজছেন:

নিম্নলিখিত ডিরেক্টরি কাঠামো (একটি উত্সর্গীকৃত উৎস ডিরেক্টরি সঙ্গে সাধারণকরণ) উপর ভিত্তি করে:

new_project/
    src/
        antigravity.py
    test/
        test_antigravity.py

উইন্ডোজ : ( new_project )

$ set PYTHONPATH=%PYTHONPATH%;%cd%\src
$ python -m unittest discover -s test

আপনি যদি ব্যাচ ফর-লুপে এটি ব্যবহার করতে চান তবে এই প্রশ্নটি দেখুন।

লিনাক্স : ( new_project )

$ export PYTHONPATH=$PYTHONPATH:$(pwd)/src  [I think - please edit this answer if you are a Linux user and you know this]
$ python -m unittest discover -s test

এই পদ্ধতির সাথে, যদি প্রয়োজন হয় তবে পাইথনপ্যাটে আরও ডিরেক্টরি যোগ করাও সম্ভব।


সমাধান / পাইথন unittest মডিউল জন্য উদাহরণ

নিম্নলিখিত প্রকল্প কাঠামো দেওয়া হয়েছে:

ProjectName
 ├── project_name
 |    ├── models
 |    |    └── thing_1.py
 |    └── __main__.py
 └── test
      ├── models
      |    └── test_thing_1.py
      └── __main__.py

আপনি আপনার প্রকল্পটি মূল ডিরেক্টরি থেকে python project_name সহ চালাতে পারেন, যা ProjectName/project_name/__main__.py কল করে।

python test পরীক্ষার সাথে আপনার পরীক্ষা চালানোর python test , কার্যকরভাবে ProjectName/test/__main__.py চলমান, আপনাকে নিম্নলিখিতগুলি করতে হবে:

1) __init__.py ফাইলটি যুক্ত করে আপনার test/models ডিরেক্টরি একটি প্যাকেজে __init__.py করুন। এটি প্যারেন্ট test ডিরেক্টরি থেকে অ্যাক্সেসযোগ্য উপ-ডিরেক্টরির মধ্যে পরীক্ষা ক্ষেত্রে করে তোলে।

# ProjectName/test/models/__init__.py

from .test_thing_1 import Thing1TestCase        

2) project_name ডিরেক্টরির অন্তর্ভুক্ত করার জন্য test/__main__.py এ আপনার সিস্টেমের পথ সংশোধন করুন।

# ProjectName/test/__main__.py

import sys
import unittest

sys.path.append('../project_name')

loader = unittest.TestLoader()
testSuite = loader.discover('test')
testRunner = unittest.TextTestRunner(verbosity=2)
testRunner.run(testSuite)

এখন আপনি সফলভাবে project_name থেকে আপনার পরীক্ষাগুলিতে project_name আমদানি করতে পারেন।

# ProjectName/test/models/test_thing_1.py    

import unittest
from project_name.models import Thing1  # this doesn't work without 'sys.path.append' per step 2 above

class Thing1TestCase(unittest.TestCase):

    def test_thing_1_init(self):
        thing_id = 'ABC'
        thing1 = Thing1(thing_id)
        self.assertEqual(thing_id, thing.id)






unit-testing