UnitTest フレームワークの基本的な使用法
1. 概念: UnitTest は Python に付属する単体テスト フレームワークです。単体テストに使用します。
2. UnitTest フレームワークの利点:
- 複数のユースケースを整理して実行する機能
- 豊富なアサーションメソッドを提供
- テストレポートを生成する機能
3. 核となる要素:
- TestCase(テストケース)
- TestSuite (テストスイート)
- TestRunner (テスト ケースをテキストとして実行します)
- TestLoader (テストケースのバッチ実行 - 指定されたフォルダー内で指定された文字で始まるモジュールを検索します)
- フィクスチャ (フィクスチャ: 2 つの固定関数、1 つは初期化時に使用され、もう 1 つは終了時に使用されます)
3.1 テストケース
1. 説明: TestCase はテスト ケースです
2. ケース:
1. パッケージのインポート: 単体テストのインポート
2. テスト クラスを定義します。新しいテスト クラスは、unittest.TestCase を継承する必要があります。
3. テスト メソッドを定義します。テスト メソッドの名前は test で始まる必要があります (注)
import unittest
class Test(unittest.TestCase):
def test01(self):
print("测试用例1")
def test02(self):
print("测试用例2")
操作結果:
注: テスト クラスのすべてのテスト メソッドを実行するには、クラスの現在行にカーソルを置き、右クリックして実行します。
単一のテスト メソッドを実行します。テスト メソッドの現在行にカーソルを置きます。
3.2 テストスイート
1. 説明: 複数のテストケースを集めたものが TestSuite (テストスイート)
2. 使用方法:
1. 实例化: suite = unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:suite.addTest(ClassName("MethodName"))
(ClassName:为类名;MethodName:为方法名)
3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName))
(搜索指定ClassName内test开头的方法并添加到测试套件中)
ヒント: TestSuite を実行するには TestRunner と連携する必要があります
3.3 テキストテストランナー
1. 説明: TextTestRunner は、テスト ケースとテスト スイートを実行するために使用されます。
2. 使用方法:
1. 实例化: runner = unittest.TextTestRunner()
2. 执行: runner.run(suite) # suite:为测试套件名称
3. ケース: (メイン プログラム ファイルが左側にあり、TestCase.py ファイルが右側にあります)
操作結果:
3.4 テストローダー
1. 説明: TestCase を TestSuite にロードするために使用されます。つまり、条件を満たすテスト ケースをロードし、テスト ケースをテスト スイートにカプセル化します。unittest.TestLoader を使用して、指定されたディレクトリ内の指定された先頭を自動的に検索します。このクラス .py ファイルの下の Discover() メソッドを使用し、見つかったテスト ケースをテスト スイートにアセンブルします。
2. 使用方法:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
自动搜索指定目录下指定开头的.py文件,并将查找到的测试用例组装到测试套件
test_dir: 为指定的测试用例的目录
pattern:为查找的.py文件的格式,默认为'test*.py'
也可以使用unittest.defaultTestLoader 代替 unittest.TestLoader()
运行:
runner = unittest.TextTestRunner()
runner.run(suite)
3. TestLoaderとTestSuiteの違い
(1) TestSuite はテスト ケースを手動で追加する必要があります (テスト クラスを追加することも、テスト クラスにテスト メソッドを追加することもできます)
(2) TestLoader は、指定されたディレクトリ内の指定された開始 .py ファイルを検索し、テスト クラス内のすべてのテスト メソッドを追加しますが、特定のテスト メソッドを追加するように指定することはできません
治具
1. 説明: フィクスチャは概要であり、テスト ケース環境の初期化と破棄はフィクスチャです。
2. 制御レベル:
- メソッドレベル
- クラスレベル
- モジュールレベル(理解)
3. 使用方法:
1、方法级别:
# 初始化(前置处理)
def setUp(self): --> 首先自动执行
# 销毁(后置处理)
def tearDown(self): --> 最后自动执行
# 运行于测试方法的始末,即:运行一次测试方法就会运行一次setUp和tearDown
2、类级别:
# 初始化(前置处理)
@classmethod
def setUpClass(cls): --> 首先自动执行
# 销毁(后置处理):
@classmethod
def tearDownClass(cls): --> 最后自动执行
# 运行于测试类的始末,即:每个测试类只会运行一次setUpClass和tearDownClass
3、模块级别(了解)
# 初始化(前置处理)
def setUpModule(): --> 首先自动执行
# 销毁(后置处理)
def tearDownModule(): --> 最后自动执行
# 运行于整个模块的始末,即:整个模块只会运行一次setUpModule和tearDownModule
4. 使用シナリオ:
(1) 初期化
- ブラウザインスタンスオブジェクトを取得する
- ブラウザを最大化する
- 暗黙的な待機
(2)終了
- ブラウザドライバオブジェクトを閉じる
断言
1. コンセプト:テストプログラムの実行結果が期待通りかどうかを人間が判断するプロセスをプログラムに置き換える
2. 一般的に使用される UnitTest アサーション メソッド:
シリアルナンバー | アサーション方法 | アサーションの説明 |
1 |
assertTrue(expr, msg=None)
|
exprが
true
である
ことを確認し、falseの場合は失敗します (重要)
|
2 |
assertFalse(expr, msg=None)
|
expr が
false
である
ことを確認し、trueの場合は失敗します
|
3 |
assertEqual(期待、実際、msg=なし)
|
Expected==actual を
検証し
、
等しくない場合は失敗します (重要)
|
4 |
assertNotEqual(first, Second,msg=None)
|
最初の != 2 番目が等しい
ことを確認し、
等しい場合は
失敗します
|
5 |
assertIsNone(obj, msg=None)
|
objが
None
である
ことを確認します。そうでない場合は失敗します。
|
6 |
assertIsNotNone(obj, msg=None)
|
objが
None
でないこと
を確認します。そうでない場合は失敗します。
|
7 |
assertIn(メンバー、コンテナ、msg=なし)
|
メンバーがコンテナー内に
あるかどうかを確認する(重要)
|
8 |
assertNotIn(メンバー、コンテナ、msg=なし)
|
メンバーがコンテナ内に存在していないかどうかを確認する
|
3. 使用方法:
import unittest
def add(x, y):
return x + y
class Assert(unittest.TestCase):
def test01(self):
num = add(1, 2)
self.assertEqual(3, num) # 判断3是否和num相等
def test02(self):
num = add(1, 2)
flag = num == 3
self.assertTrue(flag) # 判断flag是否等于True
パラメータ化する
1. 概念: データとスクリプトの分離を実現し、ユースケースの繰り返し実行を実現するために、データをパラメーターを通じて渡します。
Unittest テスト フレームワーク自体はパラメータ化をサポートしていませんが、パラメータ化された Unittest 拡張プラグインをインストールすることで実現できます。
2. データ形式:
- 単一パラメータ: タイプはリストです
- 複数のパラメータ: タイプはリストのネストされたタプルです
- テスト関数のパラメータ設定変数はパラメータ値を参照します。注: 変数の数はデータ値の数と同じである必要があります。
3. 使用方法:
- 导包:パラメータ化されたインポートからパラメータ化された
- テスト関数のパラメーターは、 @parameterized.expand デコレーターを使用してパラメーター化できます。
# 方式一
@parameterized.expand([(1, 1, 2), (1, 0, 1), (0, 0, 0)])
def test_add(self, x, y, expect):
pass
# 方式二
data = [(1, 1, 2), (1, 0, 1), (0, 0, 0)]
@parameterized.expand(data)
def test_add(self, x, y, expect):
pass
# 方式三
def build_data():
return [(1, 1, 2), (1, 0, 1), (0, 0, 0)]
@parameterized.expand(build_data)
def test_add(self, x, y, expect):
pass
飛び越える
1. はじめに: 一部のテスト関数およびテストクラスは、完了していない、またはテスト条件を満たしていない場合、実行をスキップできます。
2. 使用方法:
# 直接将测试函数标记成跳过
@unittest.skip(reason)
# 根据条件判断测试函数是否跳过
@unittest.skipIf(condition, reason)
注: 上記 2 つのメソッドは関数 (def) とクラス (class) を変更できます。
3. ケース:
import unittest
version = 35
class TestSkip(unittest.TestCase):
@unittest.skip("代码未完成")
def test_01(self):
print("test_01")
@unittest.skipIf(version <= 30, "版本大于30才会执行")
def test_02(self):
print("test_02")
結果:
HTMLテストレポートの生成
1. 説明: HTML テスト レポートは、テスト ケースの実行後に HTML (Web ページ) 形式でレポートを生成します。
2.機能:
- テストレポートはテスト結果を具体化したものです
- テストレポートにはテストケースの詳細が含まれます
3. 生成方法:
- テスト結果のエクスポート (UnitTest に含まれています)
- HTML TestRunner (サードパーティ モジュール) -重要
3.1 テスト結果のエクスポート
場合:
import unittest
# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")
# 自带执行
with open("./report.txt", "w", encoding="utf-8") as f:
unittest.TextTestRunner(stream=f, verbosity=2).run(suite)
注: strem はファイル ストリーム、verbosity は実行モード、オプション [1、2、3]
結果:
3.2 HTML テストランナー
プラグイン入手:https://pan.baidu.com/s/16rGtY_yIQ7sX5lAFolsGSg?pwd=jl89 抽出コード:jl89
場合:
# 导包
from tools.HTMLTestRunner import HTMLTestRunner
import unittest
# 定义 测试套件
suite = unittest.defaultTestLoader.discover("./", pattern="test0*.py")
# 插件执行
with open('./report.html', "wb") as f:
HTMLTestRunner(stream=f, title='xxx自动化测试报告', description='win10 Chrome').run(suite)
stream: ファイル ストリーム、書き込み用に開くレポートの名前、および書き込み用のエンコード形式 (HTML レポートはバイナリ形式である必要があります)
title: [オプションのパラメータ]、レポートのタイトルです (XXX 自動テスト レポートなど)
description: [オプションのパラメータ]、オペレーティング システムやブラウザのバージョンなど、レポートの情報を説明します。
結果: