Python自動テストフレームワークのPytestチュートリアル

愿你我相遇,皆有所获! 欢迎关注微信公众号:【伤心的辣条】 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!

Pytest

  • pytestは、次の機能を備えた非常に成熟したフル機能のPythonテストフレームワークです。
  • シンプルで柔軟性があり、使いやすい
  • パラメータ化をサポート
  • 単純な単体テストと複雑な機能テストをサポートでき、セレン/アプニウムやその他の自動テスト、インターフェース自動テスト(pytest + requests)の実行にも使用できます。
  • Pytestには多くのサードパーティプラグインがあり、pytest-selenium(統合されたセレン)、pytest-html(完全なhtmlテストレポートの生成)、pytest-rerunfailures(失敗ケースの繰り返し実行)、pytest-などのカスタマイズされた拡張機能があります。 xdist(マルチCPUディストリビューション)など。
  • テストケースのスキップおよびxfail処理
  • jenkinsとうまく統合できます
  • レポートフレームワーク---- allureはpytestもサポートしています

Pytestをインストールする

  • pip install -U pytest

Pytestのユースケース設計の原則

テストクラスはTestで始まり、initメソッドを持つことはできません

test_で始まる関数

テストで始まるクラス

すべてのパッケージpakegeには__init__。pyファイルが必要です

assertを使用してアサートします

Pytestを実行する2つの方法

Pycharmで実行されているコード

pytest.main(["test.py"])
  • コマンドライン操作モード
pytest test.py
# 运行指定类下的指定方法
pytest 文件名::类名::方法名

Pytestパラメータの説明

  • -v説明:ユースケースが配置されているファイルやユースケースの名前など、ユースケースのより詳細な実行情報を出力できます。

  • -s説明:印刷情報など、ユースケースにチューニング情報を入力します。

  • -x:エラーのあるユースケース、実行をすぐに終了し、結果を出力する

  • -v:詳細なレポートコンテンツを表示することを意味します

  • -collect-only:実行されるすべてのユースケースが表示されることを示します

  • -lf:前回失敗したユースケースのみを実行します

  • -vv:詳細なテスト結果を表示します

  • -tb = no:ユースケースの失敗のエラーの詳細を表示しません

  • -tb = line:ユースケースが失敗した特定のコード行数を表示します

  • -tb = short:より詳細なエラー情報を表示します

  • -k "Keywords"説明: "keywords"を含むユースケースを実行します

  • -q注:コンソール出力を簡略化すると、出力情報が上記の結果とは異なることがわかります。下の図には、合格結果の代わりに2つのドットがあります。

  • -maxfail = numユースケースエラーが指定された数に達したら、テストを停止します

  • m説明:特定のテストケースを実行します。ユースケースをもう一度変更して、新しいユースケースを追加しましょう

# 如果要运行多个标识的话,用表达式,如下
pytest -m "slow or faster" test_1.py  运行有slow标识或 faster标识用例
pytest -m "slow and faster" test_1.py 运行有slow和faster标识的用例
pytest -m "slow and not faster" test_1.py 运行有slow和没有faster标识的用例

注:「」(一重引用符)の後に-mを続けることはできません。「」(二重引用符)のみを使用できます。それ以外の場合は認識されません。

ini構成ファイル

  • pytest.iniファイルを作成します(書き込みを修正)
[pytest];固定写法

;变量名不能错
addopts=-vv -s ;多个参数中间空格
testpaths=../HC/huace ;多个目录中间空格
python_files=test*.py ;python文件前缀,可自定义
python_classes=huace ;指定类名
python_functions=test* ;指定方法名,可自定义

テスト機能をスキップ

  • テスト機能のスキップ:特定の条件により、特定されたテスト機能は実行されません。
# -*- coding: utf-8 -*-

import pytest

class Test():
   def test(self):
       print("执行的是testcase的用例")

@pytest.mark.skipif(condition=1<2,reason="1不大于2,所以不执行")
class huace():
   def haha(self):
       print("执行的是haha方法里面的用例")

Pytest之フィクスチャ

  • unittestとnoseは両方ともフィクスチャをサポートしますが、フィクスチャはpytestで使用するためにより柔軟です。それはpytestのハイライトでもあります
  • これは、セットアップと分解の前面と背面に似たものとして理解できます。しかし、それらよりもはるかに強力で柔軟性があります

パラメータとして渡されたfixtur

# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def login():
   print('登录系统')

# 直接使用函数名做为参数传入
def test_01(login):
   print('测试用例一')

def test_02():
   print('测试用例2')

def test03():
   print('测试用例3')

運用結果

  • ログインと呼ばれるtes_01のみ
  • 残りの質問があります。ここに10以上のメソッドがある場合はどうなりますか?ログインメソッドを呼び出す必要がありますか?以下のフィクスチャパラメータを引き続き確認してください
testcase.py::test_01 登录系统
测试用例一
PASSED
testcase.py::test_02 测试用例2
PASSED
testcase.py::test03 测试用例3
PASSED

フィクスチャ構文

# scope有4个作用范围:function(不填则默认)、class、module、session
fixture(scope='function', params=None, autouse=False, ids=None, name=None)

パラメータ説明

  • スコープ:スコープ、関数 "(デフォルト)、"クラス "、"モジュール "、"セッション "4

  • params:オプションのパラメータリスト。複数のパラメータがフィクスチャ関数を呼び出し、すべてのテストでそれが使用されます。

  • autouse:デフォルト:False、ユースケースによってフィクスチャを手動で呼び出す必要があります。Trueの場合、スコープ内のすべてのテストケースが自動的にフィクスチャを呼び出します。

  • ids:paramsテストIDの一部。そうでない場合は、paramsから自動的に生成されます。

  • name:デフォルト:デコレータの名前。同じモジュールのフィクスチャが相互に呼び出す場合は、別の名前を書き込むことをお勧めします。

  • セッションのスコープ:テストセッション全体、つまりpytestの実行の開始からテストの終了までです。scopeパラメーターは、フィクスチャのスコープを制御します:session> module> class> function

自動使用

  • パラメータはデフォルトでFalseに設定されているため、デコレータを手動で呼び出す必要があります
# -*- coding: utf-8 -*-

import pytest

# 当前就算定义了装饰器,也不会调用Login
@pytest.fixture()
def login():
   print("打开浏览器")

def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")

メソッド1の呼び出し

# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def login():
   print("打开浏览器")

# 直接传入函数名
def test1(login):
   print("test1里的用例")
   
def test2(login):
   print("test2里的用例")

メソッド2の呼び出し

# -*- coding: utf-8 -*-

import pytest

# autouse设为True,就能自动调用login的装饰器
@pytest.fixture(autouse=True)
def login():
   print("打开浏览器")

# 直接传入函数名
def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")

関数

  • 関数:スコープは関数です
  • すべてのメソッドはloginを呼び出します
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture(scope='function', autouse=True)
def login():
   print('登录系统')

def test_01():
   print('测试用例一')

def test_02():
   print('测试用例2')

def test03():
   print('测试用例3')

運用結果

  • デコレータは、ユースケース名のデザインと一致する場合に呼び出されます
  • ログインが一致しないため、呼び出されません
testcase.py::test_01 登录系统
测试用例一
PASSED
testcase.py::test_02 登录系统
测试用例2
PASSED
testcase.py::test03 登录系统
测试用例3
PASSED

クラス

  • クラス:スコープはクラスです
  • したがって、TestCase1とTestCase2の両方がログインを実行します
# -*- coding: utf-8 -*-

# @Time : 2021/1/14 21:05
# @Author : 程序员一凡

import pytest

@pytest.fixture(scope='class', autouse=True)
def login():
   print('登录系统')


def test_01():
   print('这个是类外面的用例')

class TestCase1:
   def test_02(self):
       print('测试用例2')
   def test03(self):
       print('测试用例3')

class TestCase2:
   def test_04(self):
       print('测试用例4')
   def test05(self):
       print('测试用例5')

運用結果

  • クラス内のメソッドは1回だけ呼び出されます
  • pytestメカニズム、メソッドはtestで始まるため、
testcase.py::test_01 登录系统
这个是类外面的用例
PASSED
testcase.py::TestCase1::test_02 登录系统
测试用例2
PASSED
testcase.py::TestCase1::test03 测试用例3
PASSED
testcase.py::TestCase2::test_04 登录系统
测试用例4
PASSED
testcase.py::TestCase2::test05 测试用例5
PASSED

モジュール

  • モジュール:現在の.pyスクリプトのすべてのユースケースの開始前に1回だけ実行します
  • ユースケースの設計要件を満たしている限り、クラスの内部と外部の両方が呼び出されます
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture(scope='class', autouse=True)
def open():
   print("打开浏览器,并且打开百度首页")

def test_s1():
   print("用例1:搜索python-1")

class TestCase():
   def test_s2(self):
       print("用例2:搜索python-2")

   def test_s3(self):
       print("用例3:搜索python-3")

運用結果

  • 現在のファイルのユースケースはデコレータを呼び出します
  • クラス名がTestで始まらない場合は、デコレータが呼び出されるかどうかを確認してみてください。
testcase.py::test_s1 打开浏览器,并且打开百度首页
用例1:搜索python-1
PASSED
testcase.py::TestCase::test_s2 打开浏览器,并且打开百度首页
用例2:搜索python-2
PASSED
testcase.py::TestCase::test_s3 用例3:搜索python-3
PASSED

セッション

  • フィクスチャはセッションレベルであり、.pyモジュール間で呼び出すことができます

  • .pyファイルのユースケースが複数ある場合、複数のユースケースでフィクスチャを1回呼び出すだけでよい場合は、scope = "session"に設定して、conftest.pyファイルに書き込むことができます。

  • conftest.pyファイルの名前は固定されており、pytestは自動的にファイルを認識します。プロジェクトのルートディレクトリに配置すると、グローバルに呼び出すことができます

  • パッケージに入れられた場合、そのパッケージでのみ有効になります

# -*- coding: utf-8 -*-

# conftest文件内容
import pytest

@pytest.fixture(scope="session", autouse=True)
def login():
   print("调用conftest文件的里的方法")

2つのユースケースファイル

# -*- coding: utf-8 -*-
# testcase1.py 

import pytest

def test1():
   print("test1里的用例")

def test2():
   print("test2里的用例")
   
# -*- coding: utf-8 -*-
# testcase1.py  
import pytest
def test3():
   print("test3里的用例")

def test4():
   print("test4里的用例")

運用結果

  • 2つのファイルのユースケースは、テストケースファイルのみがconftestのメソッドを調整しました
testcase.py::test1 调用conftest文件的里的方法
test1里的用例
PASSED
testcase.py::test2 test2里的用例
PASSED
testcase1.py::test3 test3里的用例
PASSED
testcase1.py::test4 test4里的用例
PASSED

pytest-allureはテストレポートを生成します

  • モジュールをインストールします:pip install allure-pytest
# 第一步:生成xml数据
pytest --alluredir=./report/xml testcase.py
# 第二步:生成html文件
allure generate --clean ./report/xml -o ./result/html

レポートにスクリーンショットを追加する

  • allure.attach(f、 '画像名'、allure.attachment_type.JPG)
# -*- coding: utf-8 -*-

from selenium import webdriver
import allure

browser=webdriver.Chrome()
browser.get("https://www.baidu.com")
try:
   browser.find_element_by_id("zhiyi").send_keys('test123456')  # 输入密码,
except Exception as e:
   file_name = './test.jpg'
   browser.save_screenshot(file_name)  # 截图函数
   '''allure添加截图附件'''
   with open(file_name, mode='rb') as file:
 **加粗样式**      # 读取文件,将读取的结果作为参数传给allure
       f = file.read()  
   # 把图片添加到allure操作步骤里
   allure.attach(f, 'login', allure.attachment_type.JPG)  
   raise e

pytestでの歩留まりと収益の違いと類似点

共通点

  • returnとyieldの両方が値を返すことができます

違い

  • yieldが値を返した後、コードビハインドは実行を継続します
  • 戻り値が返された後、次のコードは実行を継続しません
# -*- coding: utf-8 -*-

import pytest

@pytest.fixture()
def openbrower():
   print("打开浏览器")
   yield "返回浏览器"
   print("关闭浏览器")

def test01(openbrower):
   print(openbrower)

運用結果

  • イールドの背後にあるコードがまだ実行されていることを証明する
testcase.py::test01 打开浏览器
# 返回值
返回浏览器
PASSED关闭浏览器

usefixturesとpassingfixturesの違い

  • フィクスチャには戻り値があるため、usefixtureは戻り値を取得できません。これは、usefixtureデコレータとユースケースから直接渡されるフィクスチャパラメータの違いです。
  • フィクスチャがリターンパラメータを使用する必要がある場合、パラメータとして直接渡すことができるのはパラメータ名のみであり、リターンパラメータは必要ありません。両方の方法を使用できます。
  • @ pytest.mark.usefixtures( "デコレータ名")

Pytestで一般的に使用されるプラグイン

  • pytest-selenium集成セレン

  • pip installallure-pytestは美しい魅力テストレポートを生成します

  • pip installpytest-sugarはランニング効果を最適化します

  • pip install pytest-ユースケースの実行が失敗した後、rerunfailuresが再実行されます

  • pip installpytest-xdistマルチスレッド並列および分散実行

  • pip install pytest-エラーが報告された後も、複数のアサーションが実行されていると想定します

  • pip installpytest-カバーテストカバレッジ

ワンクリックで複数のモジュールをインストール

  • require.txtファイルを作成します
selenium==3.0
requests
  • pip install -r require.txt

最後に:福祉をテストします

テクノロジー業界では、技術スキルを向上させ、自動化プロジェクトでの実践的な経験を充実させる必要があります。これは、今後数年間のキャリア計画とテストテクノロジーの深さに非常に役立ちます。

ゴールデン9日とシルバー10日の面接シーズン、転職シーズンでは、面接の質問を整理することが長年の私の習慣になっています!以下は、近年の私のコレクションと並べ替えです。全体は[ソフトウェアテスト]を中心に構成されています。メインコンテンツには、Python自動化テストの独占ビデオ、Python自動化の詳細、インタビューの質問のフルセット、その他の知識コンテンツが含まれます。


ソフトウェアテストの友人にとっては、最も包括的で完全な面接準備ウェアハウスである必要があります。各モジュールをより適切に整理するために、インターネット上の多くの高品質のブログ投稿やプロジェクトも参照し、すべての知識ポイントを見逃さないように努めています。友人はこれらのコンテンツを利用してレビューを行い、BATJなどの大規模な工場からオファーを受け取りました。このウェアハウスは多くのソフトウェアテスト学習者にも役立ちました。あなたにも役立つことを願っています。

あなたと私が会い、あなたが何かを見つけることができますように!WeChatパブリックアカウントをフォローすることを歓迎します:[Sad Spicy Article] 216ページのソフトウェアテストエンジニアのインタビューブックを無料で受け取ります。そして、対応するビデオ学習チュートリアルは無料で共有できます!

おすすめ

転載: blog.csdn.net/weixin_50829653/article/details/112850488