第三に、インストールpytest依存ライブラリ
pytestをインストールするPIP
pytest-HTMLをインストールするPIP
paramikoをインストールするPIP
rpycをインストールするPIP
リクエストをインストールするPIP
第四に、使用pytest
1.プロファイル
pytest.iniがpytestメインの設定ファイルである、あなたが実行するように指定した方法に応じて、デフォルトの動作のpytestを変更することができます。Pytest.ini基本フォーマット:
#pytest.iniとしてファイルを保存します
[Pytest]
addopts = -rsxX
pytest.iniテストスクリプトはpytestコールを指定するには、ディレクトリ内またはコマンドラインパラメータで配置することができます。
pytest -c "E:\デスクトップ\ pytest_local.ini"
-cパラメータの後に、デフォルトのルートディレクトリにテストスクリプトの元pytest.iniが有効になっていないので、pytestはROOTDIRとして現在のフォルダを使用しますが、方法を指定するには、コマンドラインパラメータを使用することを推奨しない、一般的な意味を損ないます我々のテストスクリプトのルートは固定概念ディレクトリpytest.ini嘘です。もちろん、我々は実行--- ROOTDIRのルートディレクトリを指定するには、コマンドラインパラメータを開発することができます。
テストケース\ dir_level1 \ dir_level2> pytest -c "E:\デスクトップ\ pytest_local.ini" --rootdir = "E:\デスクトップ\崇高テキストBuild_x64 \ test_ini"
マニュアルを参照してくださいROOTDIR決定pytest方法:
https://docs.pytest.org/en/latest/customize.html#initialization-determining-rootdir-and-inifile
2.構成アイテム
私たちは、共通の設定項目、その他の構成アイテムをご紹介します。このセクションでは、公式のマニュアルを参照してください。
採用
addoptsパラメータは、我々は、このようなログファイルのディレクトリ情報と生成されたテストベッドを指定するなど、ユースケースプラスCMDコマンドで入力パラメータを実行するために行った時と同等のデフォルトのコマンドラインオプションを、変更することができます。
[Pytest]
addopts = --testbed = "E:\デスクトップ\ topology_template.yaml" --reportpath = "E:\デスクトップ"
--testbed
コマンド・ライン・テストベッドを指定するパラメータ、または手動で書き込むことができるコールの出力時間をaddopts、パラメータは必須です。
--reportpath
ログファイルのルートディレクトリが生成された指定し、選択されていない場合は、ログファイルは、ログのルートディレクトリとしてROOTDIRのデフォルトpytestで選択されています
python_functions
一般に、最初TestCase_のように、固定された、このように構成TestCase_始まる実施例番号と一致するテストありません
python_files
マッチテストスクリプトのファイル名は、テストケースのスクリプト名は*、TestCase_ように構成さTestCase_始まります
要約すると、我々は、以下のサブシステムのルートディレクトリに置かれpytest.iniサンプルは、スクリプトの実行時に自分のニーズに応じて変更することができます。
#1 pytest.ini
[Pytest]
addopts = -s --testbed = "E:\デスクトップ\ topology_template.yaml" --reportpath = "E:\デスクトップ"
python_files = TestCase_ *
python_functions = TestCase_ *
以下は、いくつかの一般的な設定項目について説明し
マーカー
カスタムタグのスペルエラーを避けるために、あなたは、フィールドにラベル付けされていない場合は、フィールドpytest.iniファイルにメーカーによって登録されたマーカーをマークすることができpytestランタイムを文句を言うでしょう。
[Pytest]
マーカー=
煙:実行煙テストケース
FUNC:実行functionarityのテストケース
標章の登録後、およびpytest --makersで見ることができます
第五に、脚本
単一のテストケースの1実行
シンプルな機能テストのために、の.pyファイル(test_001.py)を作成します。
#コーディング= UTF-8
方法#
デフFUNC(X):
リターンのx + 1
#テスト
デフtest_answer():
FUNC(3)== 5をアサート
注意:関数名はすべて小文字であるべきであり、TEST_を開始しなければならないテストケースを、そのようtest_answerとして
「pytest」コマンドによるテストファイルがテストを実行するディレクトリに変更します
C:\ python_ts> pytest
2.複数のテストケースを実行します
あなたは、テストクラスで複数のテストケースを作成することができます。
#コーディング= UTF-8
クラスTestClassを:
デフtest_one(自己):
X = "この"
Xで「H」をアサート
デフtest_two(自己):
X = "こんにちは"
「こんにちは」のx ==主張
注:テストクラスの命名規則は、テストし始めました。
pytest実行するファイルを指定します。
> pytest -q test_002.py
-qは静かです。静かなモードでの出力レポートを表します。の-q出力しないバージョン情報pytest。
パラメータがない場合は、pytestは、現在のディレクトリとすべてのサブディレクトリのテストファイル(またはTEST_の先頭を表示します
エンド_test)と実行。また、ファイル名、ディレクトリ名、これらの名前のリストを指定することができます。
概要の検出ルール
•テストファイルはtest_.pyまたは_test.py名前を付ける必要があります
•試験方法と機能がTEST_名前を付ける必要があります。
•テストクラスはテスト名前を付ける必要があります
結果のタイプ:
以下は、テスト結果のいくつかの一般的な機能は次のとおりです。
•PASSED(。):テストが成功しました。
•FAILED(F):テストに失敗しました。
•ERROR(E):エラー
Pythonコードから3コールpytest
pytestで実行されるPythonコード
(1)直接実行pytest.mainを()[自動的に、TEST_の_testを開始または終了ファイルにPYファイルをカレントディレクトリを検索]
([ ' - HTML形式= / report.htmlを'、 'test_xxx.py'])(2)実行パラメータpytest pytest.mainセット[test_login.py性能レポートファイルを、HTML形式を生成]
モード2では、pytest.main()プラグイン・パラメータおよびパフォーマンスパラメータ、「コンマ」によってパラメータ[]複数の複数の分割されている場合、実際にリストパラメータであります
たとえば、Cに:\ 3つのPYファイルpython_testscriptディレクトリがあります
python_testscript /
├──test_001.py
├──test_002.py
└──test_003.py
次のように前記test_003.pyコードは次のとおりです。
輸入pytest
デフtest_main():
5を主張!= 5
__name__ == '__main__' の場合:
pytest.main()
パラメータなしpytest.main直接崇高Ctrlキーを押しながら+ Bを実行し、プログラムを実行します 結果は以下の通りであります:
=============================テストセッションが開始さ================== ===========
プラットフォームのWin32 - Pythonの3.7.1、pytest-4.0.2、PY-1.7.0、pluggy-0.8.0
ROOTDIR:C:\のpython_testscript、INIFILE:
プラグイン:メタデータ-1.7.0、HTML-1.19.0
4つのアイテムを収集
test_001.py F [25%]
test_002.py .F [75%]
test_003.py F [100%]
================================== FAILURES =============== ====================
_________________________________ test_answer _________________________________
デフtest_answer():
>アサートFUNC(3)== 5
Eは4 == 5を主張します
E +ここで、4 =のFUNC(3)
test_001.py:9:AssertionErrorが
_____________________________ TestClass.test_two ______________________________
自己= <0x0000000003791A90でtest_002.TestClassオブジェクト>
デフtest_two(自己):
X = "こんにちは"
>アサートX == "HI"
E AssertionErrorが:== 'こんにちは' 'こんにちは' 主張
E - こんにちは
E + HI
test_002.py:11:AssertionErrorが
__________________________________ test_main __________________________________
デフtest_main():
> 5断言!= 5
Eアサート5!= 5
test_003.py:4:AssertionErrorが
===================== 3は===================== 1は、0.22秒で通過し、失敗しました=
【1.4秒で終了]
結果から見ると、カレントディレクトリのファイルのすべてのテストファイルのmain()のデフォルトの実装が配置されています。
だから、我々はテストファイルを実行したい場合は?あなたは()の主なパラメータに追加されたことができます。
輸入pytest
デフtest_main():
5を主張!= 5
__name__ == '__main__' の場合:
pytest.main([ 'test_001.py'])
=============================テストセッションが開始さ================== ===========
プラットフォームのWin32 - Pythonの3.7.1、pytest-4.0.2、PY-1.7.0、pluggy-0.8.0
ROOTDIR:C:\のpython_testscript、INIFILE:
プラグイン:メタデータ-1.7.0、HTML-1.19.0
1つのアイテムを収集
test_001.py F [100%]
================================== FAILURES =============== ====================
_________________________________ test_answer _________________________________
デフtest_answer():
>アサートFUNC(3)== 5
Eは4 == 5を主張します
E +ここで、4 =のFUNC(3)
test_001.py:9:AssertionErrorが
========================== 1 0.06秒に失敗し=================== ========
【1.2秒で終了]
4.共通パラメータ
(1)実施例Nの論文が停止に失敗しました
実行を停止するのに失敗した後、実施例1にpytest -x#
pytest --maxfail = 2#は2例不全の後に動作を停止し
(2)実行例を指定します
すべてのユースケースのtest_abc.pyに行っpytest test_abc.py#
pytestテスト/#はディレクトリのテストの下にすべてのユースケースを実行します
pytest test_abc.py::TestClassA::test_sample#test_sample実行方法test_abc.pyファイルTestClassAテストクラス
AR161タグpytest -v -mにより、現在のディレクトリの下に実行#、使用ケースの固定具AR1610
(3)環状実行例
pytestは30#--countバンドのパラメータは、サイクル数を指定し--count(パッケージはpytestリピートする必要があります)
(4)テストレポートを生成
pytest --junitxml =パス#タイプは、テストレポートのJUnitを生成します
pytest -v --html = testresult.html#タイプのテストレポートが生成されたHTML
印刷情報の(5)CMDコマンドライン実行
pytest --capture =なし
(6)他のパラメータ
pytest -v#出力の詳細
pytest -q#サイレントモード、出力なしのPythonのバージョン情報など
一般的なアサーションと例外処理
(1)一般的なアサーション。
「発言情報のアサーションを追加する」、== bを主張
「発言情報のアサーションを追加する」、!= Bを主張
「発言情報アサーションを追加」、主張
「発言情報アサーションを追加」、ではない主張
「発言情報のアサーションを追加」、「123ABC」で「ABC」を主張
「、「EF」ではない「123ABC」で主張発言情報のアサーションを追加
(2)Pythonの標準例外
例外名説明
すべての例外の基底クラスBaseException
SystemExitをインタプリタが終了するように要求しました
実行割り込みKeyboardInterruptユーザ(通常は^ Cを入力してください)
一般エラー例外の基底クラス
呼び出すとStopIterationイテレータこれ以上の値
出口を通知する異常GeneratorExitジェネレータ(発電機)が発生
すべての標準の例外はStandardError構築された基本クラス
すべての数値誤差ArithmeticErrorベースクラス
FloatingPointError浮動小数点演算エラー
最大制限値演算を超えOverflowErrorを
ゼロ(すべてのデータ型)のZeroDivisionError付加(またはモジュラス)
AssertionErrorがアサーションの失敗
AttributeErrorオブジェクトは、このプロパティを持っていません
例外EOFErrorには内蔵の入力EOFマーカーに到達していません
EnvironmentError基底クラスのオペレーティング・システム・エラー
例外IOErrorは、入力/出力操作が失敗します
OSErrorのオペレーティング・システム・エラー
WindowsErrorシステムコールは失敗します
ImportErrorのインポートモジュール/オブジェクト失敗
LookupErrorが無効なベース・クラスのデータのクエリ
インデックスはIndexErrorませんシーケンス(インデックス)
KeyError例外マップがこのキーを持っていません
MemoryErrorメモリオーバーフローエラー(Pythonインタプリタのために致命的ではありません)
NameErrorない宣言/初期化オブジェクト(属性なし)
初期化されていないローカル変数へのアクセスUnboundLocalError
ReferenceError弱参照オブジェクト(弱参照は)のガベージコレクションにアクセスしようとしています
RuntimeErrorが一般的な実行時エラー
満たされていないNotImplementedErrorメソッド
SyntaxError Pythonの構文エラー
IndentationErrorインデントエラー
TabErrorタブとスペースミックス
システムエラーの一般的な説明はSystemError
操作の例外TypeError型が無効です
無効なパラメータは、とValueErrorを通過しました
UnicodeErrorのUnicode関連のエラー
エラーUnicodeDecodeError Unicodeをデコードするとき
UnicodeEncodeErrorをUnicodeのエンコーディングエラー
UnicodeTranslateError Unicode変換エラー
基本クラスを警告
廃止予定の機能についての警告をDeprecationWarning
セマンティクスの将来の構造についてFutureWarning警告が変更されました
約自動的に(長い)長整数に昇格古い警告をOverflowWarning
機能上PendingDeprecationWarningすると、警告を放棄したことになります
不審な行動をRuntimeWarning(ランタイム動作)実行時の警告
不審な警告文法をSyntaxWarning
UserWarningユーザーコード生成される警告
(3)例外処理
1)を除いて...してみてください
= 10
B = 0
試してみてください。
C = A / B
除きます:
印刷(「エラー」)
印刷(「完了」)
2)例外が発生していない場合、else文が実行されます、を除いて... else文....してみてください
= 10
B = 0
試してみてください。
C = B / A
除きます:
印刷(「エラー」)
他:
印刷(「エラーなし」)
印刷(「完了」)
3)昇給は、例外を発生させます
inputValueで=入力( "入力にint型のデータを喜ば:")
タイプ(inputValueで)の場合=タイプ(1)!:
ValueErrorを送出し
他:
印刷(inputValueで)
4)最後に、かかわらず、例外が発生するかどうかの、プログラムの終了前に、最終的には文が実行されます...してみてください
= 10
B = 0
試してみてください。
C = A / B
最後に:
印刷( "常にexcute")
finally文は、文以外にも使用することができます
= 10
B = 0
試してみてください。
C = A / B
除きます:
印刷(「エラー」)
最後に:
印刷( "常にexcute")
6.正規表現
再インポートする必要があります
1)re.match機能
文字列ではなく、成功したマッチ、マッチ()Noneを返した場合、開始位置の開始位置から、パターンに一致してみてくださいre.match。
以下のような:
輸入再
開始位置におけるプリント(re.match( 'WWW'、 'www.123.com').group())#マッチ
印刷(re.match( 'COM'、 'www.123.com'))#は、開始位置と一致していません
出力:
WWW
無し
2)re.search方法
re.search最初の文字列全体をスキャンし、成功したマッチを返します。
以下のような:
輸入再
プリント(re.search( 'WWW'、 'www.123.com')。グループ())
印刷(re.search( 'COM'、 'www.123.com')。グループ())
出力:
WWW
とともに
re.matchとre.searchの違い:
re.matchは、文字列が正規表現を開始するために準拠していない場合、マッチが失敗し、関数はNoneを返し、文字列の始まりに過ぎないと一致し、かつそれが一致するものが見つかるまで、文字列全体にマッチre.search。
3)re.findall関数
すべてのサブ文字列にマッチしたされた文字列で表現を検索し、リストを返し一致が見つからない場合は、空のリストが返されます。
注意:マッチと検索がマッチし、findAllのすべてに一致します。
輸入再
印刷(re.finditer(R "\ D +"、 "12a32bc43de3"))
出力:
[ '12'、 '32'、 '43'、 '3']
4)再。Finditer機能
そして、のfindAll同様に、正式の中で発見された文字列は、すべてのサブストリングにマッチした、とイテレータとして返します。
輸入再
それはre.finditer(R "\ dの+"、 "12a32bc43de3を")=
これで試合のために:
印刷(match.group())
出力:
12
32
43
3
第六に、テストスイートのプロパティのディレクトリの内容、例えば
1.テストスイートは、テストケースとして、ディレクトリ名の特徴である__ /スタートアップの下に保存され、特徴的なディレクトリ__init。Pyと、conftest.pyとrequirements.pyとテストスクリプトファイル
1)__ init__.py:空のファイルには、あなたは、パッケージとしてディレクトリを識別することができます
2)contest.py:定義スクリプトのセットアップとティアダウン、次の構造:
#------------------------------------------------- -------
#
#コメントセクション
#
#------------------------------------- -------------------
#依存モジュール
輸入OS、SYS
sys.path.append(os.path.split(os.path.realpath(__ファイル__))[0])
の要件からのインポート*
@ pytest.fixture(範囲= 'パッケージ'、autouse =真)
デフtestuite_setup_teardown():
#準備:実行前に各プロパティのために一度実行されたすべてのユースケース
Log.log(「\ n個------------テストスイートのセットアップが始まります-------------- 「)
dta.login()
産出
#環境クリーンアップ:各実施形態のすべての実行特性が完全に実行
Log.log(「\ nは------------テストスイートティアダウンが始まり--------------」 )
@ pytest.fixture(範囲= '関数'、autouse =真)
デフtestcase_setup_teardown():
準備番号:実行し、各ユースケースの前に一度だけ実行
Log.log(「\ nを------------- --------------のTestCaseセットアップを始める」)
利回り
#環境クリーンアップ:各操作は、実施例で一度行った後
Log.log(「\ nは------------テストケースのティアダウンを開始--------------」)
3)requirements.py:すべてのモジュールが依存する必要があります保存
######################システムモジュール##########################
時間のインポート
インポート日時
インポート再
インポートはpytest
インポートSYS
インポートOSを
* ctypesのインポートから
###################### pytest_testlib_base模块##########################
インポートログ
インポートrpyc_clientの
輸入rpyc_server
######################本地自定义共通模块####################### ###
sys.path.append( "%sの/../../共通/" %(os.path.split(os.path.realpath(__ファイル__))[0]))
sys.path.append( "%sの/../../共通/ STARTUP" %(os.path.split(os.path.realpath(__ファイル__))[0]))
インポートpy_baseの
インポートfile_method
4)テストスクリプトファイル:
#------------------------------------------------- -------
#
# -
#ユースケース番号:TESTCASE_1001
#ユースケース名:テストデモ
#--------------------------------- -----------------------
要件からインポート*
@ pytest.fixture(範囲= '関数'、autouse =真)
デフprepare_cleanup():
Log.log( '\ nの------------始める準備--------- ----- ')
収量
Log.log(' \ nは------------クリーンアップは「--------------開始)
デフTESTCASE_1001():
Log.log(「手順1、デバイスは、期待される結果1で開始」)
#Py_base.py文書とcheck_startupの方法は、一般的なフォルダ、プロジェクトディレクトリ全体でローカルrequirements.pyにより導入されたカスタム共通モジュール宣言を定義します
py_base.check_startup(dev_a)
Log.log(「期待結果を図1に示すように、デバイスが起動」)