Pytestユニットテストシリーズ[v 1.0.0][プロファイル]
42764 ワード
Pytestのプロファイルの理解
Pytestにはどのようなプロファイルがありますか.
プロファイル
説明:どのプロファイルを使用するかにかかわらず、フォーマットはほぼ同じです.
pytest.ini
pytestプライマリプロファイル、pytestのデフォルト動作を変更できます
conftest.py
hook関数とfixtureがファイルのあるディレクトリとそのサブディレクトリに作用するローカルプラグインライブラリ
__init__.py
各テストサブディレクトリにファイルが含まれている場合、複数のテストディレクトリに同じ名前のテストファイルが表示されます.
tox.ini
toxツールを使用するとtoxが使用されます.ini、pytestと.iniは似ていて、toxのプロファイルにすぎず、pytestのプロファイルをtoxに書くことができます.iniではpytestを同時に使用する必要はありません.iniとtox.iniだ
setup.cfg
iniファイルフォーマットも採用する、setupに影響を与える.pyの動作は、pythonパッケージをパブリッシュする場合も、setupで大きな役割を果たすことができます.pyファイルに数行のコードを追加し、python setupを使用します.py testはすべてのpytestテスト例を実行します.pythonパッケージをパブリッシュする場合はsetupも使用できます.cfgファイルはpytestの構成情報を格納する
pytest.ini
;---
; Excerpted from "Python Testing with pytest",
; published by The Pragmatic Bookshelf.
; Copyrights apply to this code. It may not be used to create training material,
; courses, books, articles, and the like. Contact us if you are in doubt.
; We make no guarantees that this code is fit for any purpose.
; Visit http://www.pragmaticprogrammer.com/titles/bopytest for more book information.
;---
[pytest]
addopts = -rsxX -l --tb=short --strict
xfail_strict = true
;... more options ...
tox.ini
;---
; Excerpted from "Python Testing with pytest",
; published by The Pragmatic Bookshelf.
; Copyrights apply to this code. It may not be used to create training material,
; courses, books, articles, and the like. Contact us if you are in doubt.
; We make no guarantees that this code is fit for any purpose.
; Visit http://www.pragmaticprogrammer.com/titles/bopytest for more book information.
;---
;... tox specific stuff ...
[pytest]
addopts = -rsxX -l --tb=short --strict
xfail_strict = true
;... more options ...
setup.cfg
;... packaging specific stuff ...
[tool:pytest]
addopts = -rsxX -l --tb=short --strict
xfail_strict = true
;... more options ...
コマンド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.
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
disable_test_id_escaping_and_forfeit_all_rights_to_community_support (bool) disable string escape non-ascii characters, might cause unwanted side effects(use at your own
console_output_style (string) console output: "classic", or with additional progress information ("progress" (percentage) | "count").
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
junit_duration_report (string) Duration time to report: one of total|call
junit_family (string) Emit XML for schema: one of legacy|xunit1|xunit2
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
rsyncdirs (pathlist) list of (relative) paths to be rsynced for remote distributed testing.
rsyncignore (pathlist) list of (relative) glob-style paths to be ignored for rsyncing.
looponfailroots (pathlist) directories to check for changes
timeout (string) Timeout in seconds before dumping the stacks. Default is 0 which
means no timeout.
timeout_method (string) Timeout mechanism to use. 'signal' uses SIGALRM if available,
'thread' uses a timer thread. The default is to use 'signal' and fall
back to 'th
timeout_func_only (bool) When set to True, defers the timeout evaluation to only the test
function body, ignoring the time it takes when evaluating any fixtures
used in t
pytester_example_dir (string) directory to take the pytester example files from
environment variables:
PYTEST_ADDOPTS extra command line options
PYTEST_PLUGINS comma-separated plugins to load during startup
PYTEST_DISABLE_PLUGIN_AUTOLOAD set to disable plugin auto-loading
PYTEST_DEBUG set to enable debug tracing of pytest's internals
プラグインはiniファイルオプションを追加できます
前に列挙したこれらのオプションを除いて、プラグインとconftestを利用します.pyファイルは、新しいオプションを追加することもできます.また、新しいオプションはpytest--helpで表示することもできます.
デフォルトのコマンドラインオプションの変更
前の文章を通じて、すでに多くのpytestオプションに触れています.例えば、-v/–verboseは詳細を出力することができます.-l/–showlocalsは失敗したテスト例のスタックのローカル変数を表示することができます.これらのオプションをよく使うかもしれませんが、入力を繰り返したくない場合は、pytestを借りることができます.iniファイルのaddopts設定
[pytest]
addopts = -rsxX -l --tb=short --strict
オプション
紹介する
-rsxX
pytestレポートのすべてのテスト・インスタンスがスキップされ、失敗が予想され、失敗が予想されますが、実際に合格した理由を示します.
-l
pytestレポートのすべての失敗したテスト例を表す対戦中のローカル変数
–tb=short
スタック遡及情報を簡略化し、ファイルと行数のみを保持することを示します.
–strict
オプションは、プロファイルに登録されていないタグの使用を禁止することを示します.
スペルミスを防ぐためのタグの登録
pytestでiniに登録されたタグ:
[pytest]
markers=
smoke: Run the smoke test functions for tasks project
get:Run the test functions that test tasks.get()
タグ登録が完了したらpytest--markersで表示できます
(venv) E:\Programs\Python\Python_Pytest\pytest-nice>pytest --markers
@pytest.mark.smoke: Run the smoke test functions for tasks project
@pytest.mark.get:Run the test functions that test tasks.get()
これによりaddoptsに–strictを付けると、登録されていないタグは使用できないため、スペルミスを最小限に抑えることができます.
pytestの最低バージョン番号を指定します
minversionオプションでは、2つの浮動小数点数の値が近いかどうかをテストするなど、テスト例を実行するpytestの最低バージョンを指定できます.approx()関数を使用しますが、pytest 3まで機能します.0が現れたのでpytestでiniファイルに追加
[pytest]
minversion = 3.0
pytestを指定してディレクトリを無視
pytestは検索を実行すると、すべてのサブディレクトリを再帰的に巡回し、norecurseオプションを使用してpytestの検索作業を簡略化できます.Norecurseのデフォルト値は
.* build dist CVS _darcs {arch}
と*.egg
ですpytestにTasksプロジェクトのsrcディレクトリを無視させる場合はnorecursedirsに参加する必要があります[pytest]
norecursedirs = .* venv src *.egg dist build
テストディレクトリの指定
testpathsはpytestがどこへアクセスするかだけで、ルートディレクトリに対する一連のパスであり、pytestがファイルディレクトリパラメータまたはテストインスタンス識別子を指定していない場合にのみ開始されます.
task_proj/
|------pytest.ini
|------src
| |------tasks
| |------api.py
| |------......
|------test
|------conftest.py
|------func
| |------__init__py
| |------test_add.py
| |------......
|------unit
|------__init__.py
|------test_task.py
|------......
たとえば、このようなメカニズムディレクトリでは、testディレクトリをpytestの実行パスとして指定します.
[pytest]
testpaths = test
そしてtasks_からProjがpytestを実行し始めると、pytestは直接testパスを探します.
テスト検索のルールの変更
pytestの実行は、一定のルールに基づいてテストを検索して実行します.
[pytest]
python_classes = *Test Test* *Suite
python_のようにclasses同様python_filesはtest_のみで検索するのではなく、デフォルトのテスト検索ルールを変更できます.先頭のファイルと_testの最後のファイル
[pytest]
python_files = test_* *_test check_*
検索テスト関数とメソッドのネーミングルールも変更できます.
[pytest]
python_functions = test_* check_*
XPASSを無効にする
設定
xfail_strict = true
は、それらを@pytestとしてマークする.mark.xfailですが、実際に合格したテスト例も失敗として報告されます.ファイル名の競合を回避
duplicate
|------dup_a
| |------test_func.py
| dup_b
| |------test_func.py
2つのpyファイルにそれぞれ関数test_を書き込むa()とtest_b()
def test_a():
pass
def test_b():
pass
このようなディレクトリ構造では、同じ名前のファイルが2つあります.ファイルの内容は異なりますが、競合し、pyファイルを単独で実行できますが、duplicateパスで実行するとだめです.次のエラーが表示されます.
(venv) E:\Programs\Python\Python_Pytest\SourceCode\ch6\duplicate>pytest
================== test session starts ===================================
platform win32 -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
rootdir: E:\Programs\Python\Python_Pytest, inifile: pytest.ini
plugins: xdist-1.29.0, timeout-1.3.3, repeat-0.8.0, nice-0.1.0, instafail-0.4.1, forked-1.0.2, emoji-0.2.0, allure-pytest-2.6.3
collected 1 item / 1 errors
=========================================== ERRORS ============================
____________________ ERROR collecting SourceCode/ch6/duplicate/b/test_func.py __________________________
import file mismatch:
imported module 'test_func' has this __file__ attribute:
E:\Programs\Python\Python_Pytest\SourceCode\ch6\duplicate\a\test_func.py
which is not the same as the test file we want to collect:
E:\Programs\Python\Python_Pytest\SourceCode\ch6\duplicate\b\test_func.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.32 seconds ==========================================
エラーメッセージにも問題がどこにあるかは明らかではありませんが、この問題を解決するには、各サブディレクトリに空の__を追加するだけです.init__.pyファイルでOK、サブディレクトリの追加をテストします_init__.pyはいい習慣です