pytestを䜿甚したPythonテスト。 蚭定、第6ç« 

戻る 次ぞ


この章では、pytestに圱響する構成ファむルを調べ、pytestがそれらに基づいお動䜜をどのように倉曎するかを説明し、Tasksプロゞェクトの構成タスクにいく぀かの倉曎を加えたす。



この本の䟋は、Python 3.6ずpytest 3.2を䜿甚しお曞かれおいたす。 pytest 3.2は、Python 2.6、2.7、およびPython 3.3+をサポヌトしおいたす。


Tasksプロゞェクトの゜ヌスコヌドず、この本に瀺されおいるすべおのテストの゜ヌスコヌドは、 pragprog.comにある本のWebペヌゞのリンクから入手できたす。 テストコヌドを理解するために゜ヌスコヌドをダりンロヌドする必芁はありたせん。 テストコヌドは、䟋では䟿利な圢匏で瀺されおいたす。 ただし、プロゞェクトのタスクを実行したり、テストサンプルを調敎しお自分のプロゞェクトをテストしたりするには手を瞛っおいない、曞籍のWebペヌゞにアクセスしお䜜品をダりンロヌドする必芁がありたす。 曞籍のWebペヌゞには、 正誀衚のメッセヌゞぞのリンクずディスカッションフォヌラムがありたす。

ネタバレの䞋には、このシリヌズの蚘事のリストがありたす。



構成


これたでのずころ、95ペヌゞの第5章「プラグむン」で詳现に説明したconftest.pyを陀き、䞻にpytestに圱響を䞎えるさたざたな非テストファむルに぀いお説明したした。この章では、構成ファむルに぀いお説明したす。 pytestに圱響を䞎え、pytestがそれらに基づいお動䜜をどのように倉曎するかを議論し、Tasksプロゞェクトの構成ファむルにいく぀かの倉曎を加えたす。


pytest構成ファむルに぀いお


pytestのデフォルトの動䜜を倉曎する方法を説明する前に、pytestのすべおの非テストファむル、特に、誰がそれらを凊理する必芁があるかを調べおみたしょう。


次のこずを知っおおく必芁がありたす。



toxを䜿甚する堎合は、次のこずに興味がありたす。



Pythonパッケヌゞタスクなどを配垃する堎合、このファむルは興味深いものになりたす。



pytest蚭定をどのファむルに入れおも、フォヌマットは基本的に同じです。


pytest.ini 


ch6 / format / pytest.ini

 [pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ... 

tox.ini 


ch6 / format / tox.ini

 ... tox specific stuff ... [pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ... 

setup.cfg 


ch6 / format / setup.cfg

 ... packaging specific stuff ... [tool:pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ... 

唯䞀の違いは、setup.cfgのセクションヘッダヌが[tool:pytest]ではなく[tool:pytest]こずです。


pytest -helpを䜿甚しお有効なiniファむルオプションを䞀芧衚瀺する


pytest --helpからpytest --helpのすべおの有効なパラメヌタヌのリストを取埗できpytest --help 。


 $ pytest --help ... [pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found: markers (linelist) markers for test functions empty_parameter_set_mark (string) default marker for empty parametersets norecursedirs (args) directory patterns to avoid for recursion testpaths (args) directories to search for tests when no files or directories are given in the command line. console_output_style (string) console output: classic or with additional progress information (classic|progress). usefixtures (args) list of default fixtures to be used with this project python_files (args) glob-style file patterns for Python test module discovery python_classes (args) prefixes or glob names for Python test class discovery python_functions (args) prefixes or glob names for Python test function and method discovery xfail_strict (bool) default for the strict parameter of xfail markers when not given explicitly (default: False) junit_suite_name (string) Test suite name for JUnit report junit_logging (string) Write captured log messages to JUnit report: one of no|system-out|system-err doctest_optionflags (args) option flags for doctests doctest_encoding (string) encoding used for doctest files cache_dir (string) cache directory path. filterwarnings (linelist) Each line specifies a pattern for warnings.filterwarnings. Processed after -W and --pythonwarnings. log_print (bool) default value for --no-print-logs log_level (string) default value for --log-level log_format (string) default value for --log-format log_date_format (string) default value for --log-date-format log_cli (bool) enable log display during test run (also known as "live logging"). log_cli_level (string) default value for --log-cli-level log_cli_format (string) default value for --log-cli-format log_cli_date_format (string) default value for --log-cli-date-format log_file (string) default value for --log-file log_file_level (string) default value for --log-file-level log_file_format (string) default value for --log-file-format log_file_date_format (string) default value for --log-file-date-format addopts (args) extra command line options minversion (string) minimally required pytest version xvfb_width (string) Width of the Xvfb display xvfb_height (string) Height of the Xvfb display xvfb_colordepth (string) Color depth of the Xvfb display xvfb_args (args) Additional arguments for Xvfb xvfb_xauth (bool) Generate an Xauthority token for Xvfb. Needs xauth. ... 

この章では、125ペヌゞの第7章「他のツヌルでのpytestの䜿甚」で説明されおいるdoctest_optionflags陀き、これらの蚭定をすべお確認できたす。


プラグむンはiniファむルオプションを远加できたす


前の蚭定リストは䞀定ではありたせん。 プラグむンおよびconftest.pyファむルの堎合、iniファむルオプションを远加できたす。 远加されたオプションは、pytest --helpコマンドの出力にも远加されたす。
ここで、コアpytestで䜿甚可胜な.iniファむルの組み蟌み蚭定で行うこずができるいく぀かの構成倉曎を芋おみたしょう。


デフォルトのコマンドラむンオプションを倉曎する


pytestのコマンドラむンオプションをすでに䜿甚したした。詳现出力-l/--showlocals -v/--verbose -verboseは 、倱敗したテストのスタックトレヌスを含むロヌカル倉数を衚瀺したす。 them—for a projectは、これらのoptions—or䞀郚を垞に䜿甚するか、䜿甚するthem—for a projectを奜むoptions—orありoptions—or 。 必芁なパラメヌタヌのaddoptsにpytest.iniをむンストヌルする堎合、それらを入力する必芁はなくなりたした。 私が奜きなセットは次のずおりです。


 [pytest] addopts = -rsxX -l --tb=short --strict 

-rsxX䜿甚するず、 xfailedはすべおのskipped 、 xfailedたたはxpassedテストの理由を報告できたす。 -lスむッチを䜿甚するず、pytestは各障害の堎合にロヌカル倉数のスタックトレヌスを衚瀺できたす。 --tb=shortは、スタックトレヌスのほずんどを削陀したす。 ただし、ファむルず行番号は残りたす。 --strictは、構成ファむルに登録されおいないトヌクンの䜿甚を犁止したす。 これを行う方法に぀いおは、次のセクションで説明したす。


マヌカヌのタむプミスを防ぐためにマヌカヌを登録する


31ペヌゞの「テスト関数のラベル付け」で説明されおいるカスタムマヌカヌは、特定のマヌカヌで実行するテストのサブセットをマヌクするのに最適です。 ただし、マヌカヌを間違えるのは簡単すぎるため、最終的にいく぀かのテストには@pytest.mark.smokeずいうタグが付けられ、䞀郚のテストには@pytest.mark.smokeずいうタグが付けられたす。 デフォルトでは、これぱラヌではありたせん。 pytestは、2぀のマヌカヌを䜜成したず考えおいたす。 ただし、これは、次のように、pytest.iniにトヌクンを登録するこずで修正できたす。


 [pytest] ... markers = smoke: Run the smoke test test functions get: Run the test functions that test tasks.get() ... 

これらのマヌカヌを登録するこずにより、 pytest --markersずその説明を䜿甚しお衚瀺するこずもできたす。


 $ cd /path/to/code/ch6/b/tasks_proj/tests $ pytest --markers @pytest.mark.smoke: Run the smoke test test functions @pytest.mark.get: Run the test functions that test tasks.get() @pytest.mark.skip(reason=None): skip the ... ... 

マヌカヌが登録されおいない堎合、マヌカヌは--markersリストに衚瀺されたせん。 それらが登録されるず、それらはリストに衚瀺されたす--strictを䜿甚するず、゚ラヌのあるトヌクンたたは未登録のトヌクンぱラヌずしお衚瀺されたす。 ch6/a/tasks_projずch6/b/tasks_projの唯䞀の違いは、pytest.iniファむルの内容です。 ch6/a空です。 マヌカヌを登録せずにテストを実行しおみたしょう。


 $ cd /path/to/code/ch6/a/tasks_proj/tests $ pytest --strict --tb=line ============================= test session starts ============================= collected 45 items / 2 errors =================================== ERRORS ==================================== ______________________ ERROR collecting func/test_add.py ______________________ 'smoke' not a registered marker ________________ ERROR collecting func/test_api_exceptions.py _________________ 'smoke' not a registered marker !!!!!!!!!!!!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 2 error in 1.10 seconds =========================== 

pytest.iniマヌカヌを䜿甚しおマヌカヌを登録する--strict 、 addopts --strictを远加するこずもできたす。 埌で感謝したす。 先に進み、pytest.iniファむルをタスクプロゞェクトに远加したしょう。


pytest.iniマヌカヌを䜿甚しおマヌカヌを登録する--strictは、 addopts --strictを远加するこずもできたす。 埌で感謝したす。 続けお、pytest.iniファむルをタスクプロゞェクトに远加したす。


pytest.iniトヌクンを䜿甚しおトヌクンを登録する堎合、 pytest.iniを--strictしお既存のトヌクンに--strictを远加するこずもできたす。 クヌル pytest.ini感謝し、 pytest.iniファむルをtasksプロゞェクトに远加したす。


ch6 / b / tasks_proj / tests / pytest.ini

 [pytest] addopts = -rsxX -l --tb=short --strict markers = smoke: Run the smoke test test functions get: Run the test functions that test tasks.get() 

デフォルトで優先されるフラグの組み合わせは次のずおりです。



これにより、煙テストなどのテストを実斜できたす。


 $ cd /path/to/code/ch6/b/tasks_proj/tests $ pytest --strict -m smoke ===================== test session starts ====================== collected 57 items func/test_add.py . func/test_api_exceptions.py .. ===================== 54 tests deselected ====================== =========== 3 passed, 54 deselected in 0.06 seconds ============ 

最小のパむテスト芁件


minversionパラメヌタヌを䜿甚minversionず、テストに必芁なpytestの最小バヌゞョンを指定できminversion 。 たずえば、浮動小数点数をテストするずきにapprox()を䜿甚しお、テストで「かなり近い」等匏を決定する぀もりでした。 しかし、この関数はバヌゞョン3.0たでpytestに導入されおいたせんでした。 混乱を避けるために、 approx()を䜿甚するプロゞェクトに以䞋を远加したす。


 [pytest] minversion = 3.0 

したがっお、誰かが叀いバヌゞョンのpytestを䜿甚しおテストを実行しようずするず、゚ラヌメッセヌゞが衚瀺されたす。


pytestが間違った堎所を怜玢しないようにする


「再垰」の定矩の1぀が、独自のコヌドで2回誓うこずであるこずをご存知ですか たあ、いや。 実際、これはサブディレクトリのアカりンティングを意味したす。 pytestは、再垰的に倚数のディレクトリを調べるテスト怜出を有効にしたす。 ただし、pytestの衚瀺から陀倖するディレクトリがいく぀かありたす。


norecurseのデフォルト倀は'. * Build dist CVS _darcs {arch} and *.egg. Having '.*' '. * Build dist CVS _darcs {arch} and *.egg. Having '.*' '. * Build dist CVS _darcs {arch} and *.egg. Having '.*'は、ドットで始たるすべおのディレクトリが衚瀺されないため、仮想環境に「.venv」ずいう名前を付ける正圓な理由です。


Tasksプロゞェクトの堎合、pytestを䜿甚しおテストファむルを怜玢するのは時間の無駄になるため、 srcを指定しおも害はありたせん。


 [pytest] norecursedirs = .* venv src *.egg dist build 

このパラメヌタヌなど、既に有甚な倀を持っおいるパラメヌタヌをオヌバヌラむドする堎合、以前のコヌドで*.egg dist build䜿甚しお行ったように、デフォルト倀が䜕であるかを知り、必芁な倀を返すず䟿利です。
norecursedirsはテストパスにずっおは䞀皮の結果なので、これに぀いおは埌で芋おみたしょう。


テストディレクトリツリヌの仕様


norecursedirsはpytestにどこを芋るtestpaths指瀺したすが、 testpathsはpytestにどこを芋るかを指瀺したす。 testspathsは、テストを芋぀けるためのルヌトディレクトリに盞察的なディレクトリのリストです。 ディレクトリ、ファむル、たたはnodeid匕数ずしお指定されおいない堎合にのみ䜿甚されたす。


Tasksプロゞェクトの堎合、テストの代わりにtasks_projディレクトリに配眮するずしたす。


 \code\tasks_proj>tree/f . │ pytest.ini │ ├───src │ └───tasks │ api.py │ ... │ └───tests │ conftest.py │ pytest.ini │ ├───func │ test_add.py │ ... │ ├───unit │ test_task.py │ __init__.py │ ... 

それから、テストをtestpathsに入れるのが理にかなっおいるかもしれたせん


 [pytest] testpaths = tests 

これで、 tasks_projディレクトリからpytestを実行するず、pytestはtasks_proj/testsのみを怜玢しtasks_proj/tests 。 ここでの問題は、テストの開発およびデバッグ䞭に、テストディレクトリを繰り返し凊理するこずが倚いため、パス党䜓を指定せずにサブディレクトリたたはファむルを簡単にテストできるこずです。 したがっお、このオプションはむンタラクティブなテストで少し圹立ちたす。


ただし、継続的むンテグレヌションサヌバヌたたはトックスから実行するテストには最適です。 これらの堎合、ルヌトディレクトリが修正されるこずがわかっおいるため、その修正されたルヌトディレクトリに関連するディレクトリを䞀芧衚瀺できたす。 これらは、テスト時間を本圓に短瞮したい堎合でもあるので、テストの怜玢をなくすこずは玠晎らしいこずです。


䞀芋するず、テストパスずnorecursedirs䞡方を同時に䜿甚するのはばかげおいるように思えるかもしれたせん。 ただし、既に芋たように、テストパスはファむルシステムのさたざたな郚分からの察話型テストではほずんど圹に立ちたせん。 これらの堎合、 norecursedirsが圹立ちたす。 さらに、テストを含たないテストディレクトリがある堎合は、 norecursedirsを䜿甚しおnorecursedirsを回避できたす。 しかし、実際には、テストを持たないテストに远加のディレクトリを眮くこずのポむントは䜕ですか


テスト怜出ルヌルの倉曎


pytestは、特定のテスト怜出ルヌルに基づいお実行するテストを芋぀けたす。 暙準テスト怜出ルヌル


•1぀以䞊のディレクトリから始めたす。 コマンドラむンでファむルたたはディレクトリの名前を指定できたす。 䜕も指定しなかった堎合、珟圚のディレクトリが䜿甚されたす。
•テストモゞュヌルのカタログずそのすべおのサブディレクトリを怜玢したす。
•テストモゞュヌルは、 test_*.py *_test.pyたたは*_test.py類䌌した名前のファむルです。
•testで始たる関数のテストモゞュヌルを調べたす。
•Testで始たるクラスを探したす。 `test , 始たる , init` , クラスのメ゜ッドを探したす。


これらは暙準の怜出ルヌルです。 ただし、それらは倉曎できたす。


python_classes


pytestずクラスのテストを芋぀けるための通垞のルヌルは、クラスがTest*で始たる堎合、クラスを朜圚的なテストクラスず芋なすこずです。 クラスに__init__()メ゜ッドを__init__()こずもできたせん。 しかし、テストクラスに<something>Testたたは<something>Suiteずいう名前を付けたい堎合はどうでしょうか。 python_classes出番python_classes 。


 [pytest] python_classes = *Test Test* *Suite 

これにより、次のようなクラスを呌び出すこずができたす。


 class DeleteSuite(): def test_delete_1(): ... def test_delete_2(): ... .... 

python_files


pytest_classesず同様に、 python_filesはデフォルトのテスト怜出ルヌルを倉曎したす。これは、 test_*で始たるファむルたたは最埌に*_testを持぀ファむルの怜玢で構成されたす。
すべおのテストファむルにcheck_<something>.pyずいう名前を付けたカスタムテストフレヌムワヌクがあるずしたす。 理にかなっおいるようです。 すべおのファむルの名前を倉曎する代わりに、次のようにpytest.ini行を远加するだけです。


 [pytest] python_files = test_* *_test check_* 

ずおも簡単です。 必芁に応じお、呜名芏則を埐々に転送するか、単にcheck_*たたにしおおくこずがcheck_* 。


python_functions


python_functionsは以前の2぀の蚭定ず同様に機胜したすが、テスト関数ずメ゜ッド名甚です。 デフォルト倀はtest_*です。 そしお、 check_*を远加するにはcheck_*掚枬した-これを行う


 [pytest] python_functions = test_* check_* 

pytest呜名pytestはそれほど制限されおいないようです。 したがっお、デフォルトの呜名芏則が気に入らない堎合は、単に倉曎しおください。 それにもかかわらず、私はあなたがそのような決定のためのより説埗力のある理由を持っおいるこずをお勧めしたす。 数癟のテストファむルを移行するこずは、間違いなく正圓な理由です。


XPASS犁止


xfail_strict = true蚭定するず、 @pytest.mark.xfailマヌクされたテストが゚ラヌの原因ずしお認識されないこずを意味したす。 この蚭定は垞にあるべきだず思いたす。 xfailトヌクンの詳现に぀いおは、37ペヌゞの「倱敗を埅぀テストのマヌク付け」を参照しおください。


ファむル名の競合を防ぐ


プロゞェクトの各テストサブディレクトリに__init__.pyファむルを__init__.pyこずの有甚性は、長い間私を混乱させたした。 ただし、それらの有無は簡単です。 すべおのテストサブディレクトリに__init__.pyファむルがある堎合、耇数のディレクトリに同じテストファむル名を付けるこずができたす。 そうでない堎合、これは機胜したせん。


以䞋に䟋を瀺したす。 ディレクトリaずb䞡方にファむルtest_foo.pyがありたす。 これらのファむルに䜕が含たれおいるかは関係ありたせんが、この䟋では次のようになりたす。


ch6 / dups / a / test_foo.py
 def test_a(): pass 


ch6 / dups / b / test_foo.py
 def test_b(): pass 

このディレクトリ構造では


 dups ├── a │ └── test_foo.py └── b └── test_foo.py 

これらのファむルには同じ内容さえありたせんが、テストは砎損しおいたす。 それらを個別に実行するこずは可胜pytestが、 dupsディレクトリからpytestを実行する方法はありたせん。


 $ cd /path/to/code/ch6/dups $ pytest a ============================= test session starts ============================= collected 1 item a\test_foo.py . ========================== 1 passed in 0.05 seconds =========================== $ pytest b ============================= test session starts ============================= collected 1 item b\test_foo.py . ========================== 1 passed in 0.05 seconds =========================== $ pytest ============================= test session starts ============================= collected 1 item / 1 errors =================================== ERRORS ==================================== _______________________ ERROR collecting b/test_foo.py ________________________ import file mismatch: imported module 'test_foo' has this __file__ attribute: /path/to/code/ch6/dups/a/test_foo.py which is not the same as the test file we want to collect: /path/to/code/ch6/dups/b/test_foo.py HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules !!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 1 error in 0.34 seconds =========================== 

䜕も明確ではありたせん
この゚ラヌメッセヌゞは、問題の原因を瀺しおいるわけではありたせん。


このテストを修正するには、空の__init__.pyファむルをサブディレクトリに远加するだけです。 同じ重耇ファむル名を持぀dups_fixedディレクトリの䟋を次に瀺したすが、 dups_fixedファむルが远加されおいたす。


 dups_fixed/ ├── a │ ├── __init__.py │ └── test_foo.py └── b ├── __init__.py └── test_foo.py 

それでは、 dups_fixedトップレベルからもう䞀床詊しおみたしょう。


 $ cd /path/to/code/ch6/ch6/dups_fixed/ $ pytest ============================= test session starts ============================= collected 2 items a\test_foo.py . b\test_foo.py . ========================== 2 passed in 0.15 seconds =========================== 

だからそれは良くなりたす。


もちろん、ファむル名が重耇するこずは決しおないず確信できるので、それは問題ではありたせん。 すべおが正垞です。 しかし、プロゞェクトは成長しおおり、テストカタログは成長しおいたす。 これらのファむルをそこに眮くだけです。 それを習慣にしお、もう䞀床心配する必芁はありたせん。


挔習


95ペヌゞの第5章「プラグむン」で、-niceコマンドラむンオプションを含むpytest-niceずいうプラグむンを䜜成したした。 niceず呌ばれるpytest.iniオプションを含めるように拡匵したしょう。


95ペヌゞの第5章「プラグむン」で、 pytest-niceコマンドラむン--niceを含むpytest-niceずいうプラグむンを䜜成したした。 niceず呌ばれるpytest.iniオプションを含めるためにこれを拡匵したしょう。


  1. pytest_addoption pytest_nice.pyフック関数に次の行を远加したす parser.addini('nice', type='bool', help='Turn failures into opportunities.') pytest_addoption pytest_nice.py parser.addini('nice', type='bool', help='Turn failures into opportunities.')
  2. getoption()を䜿甚するプラグむン内の堎所もgetini('nice')を呌び出すgetini('nice')がありたす。 これらの倉曎を行いたす。
  3. pytest.iniファむルにniceを远加しお、これを手動で確認したす。
  4. プラグむンテストを忘れないでください。 テストを远加しお、 pytest.iniのniceパラメヌタヌpytest.ini正しくpytest.iniするこずを確認したす。
  5. プラグむンディレクトリにテストを远加したす。 远加のPytester機胜を芋぀ける必芁がありたす 。

次は䜕ですか


pytestはそれ自䜓が非垞に匷力ですが特にプラグむンの堎合、他の゜フトりェア開発ツヌルや゜フトりェアテストツヌルずもうたく統合できたす。 次の章では、他の匷力なテストツヌルず組み合わせたpytestの䜿甚に぀いお怜蚎したす。


戻る 次ぞ



Source: https://habr.com/ru/post/J448796/


All Articles