転載:https://www.cnblogs.com/testjiali/p/10421304.html
インターフェイスオートメーション戦闘パイソン(第2段階) - コードデータのうち
我々はすでに、パッケージ要求インターフェースを実現するために書かれたテストユニットテストフレームワークを達成したので、そのインターフェイスは、自動テストで完了することができ、それは高い再利用性ではありません。
我々は、各メソッド(テスト)コードは、想像データの各セットが書き込まれている場合我々のテストシナリオでは、登録インターフェースは、テストケースの数十ダースがあるかもしれない、ほとんど同じである参照します片道、そうではないだけで、効率が良く、高くないメンテナンスではない、より多くの重複コードが存在します。
次に、1)一緒にテストデータ管理と、データ駆動型のアプローチを使用して、フレームのために最適化されたパッケージを実行するテーブル、コードをエクセル、2)試験DDTを駆動するために、互いに独立した二つの部分。
1.データおよびコードの分離:Excelのテストデータ管理
、URL、paramsは、方法等をexpect_res、変更することが助長されていません。コードでは、test_register.pyモジュールは、テストデータのセットを提供するために必要な3つの方法(3つのテストケース)、各テストケースを定義しますそして今、私たちの新しいExcelファイル(TestData.xlsx)を構築し、。次のように:
ケースデザイン・オートメーション:
自動化されたテストケースのデザインは、より優れた自動化されたテストデータを設計するために、ビジネスプロセスを持つ唯一の馴染みのビジネスプロセスの使い慣れたインタフェースに基づいています。ここで考慮すべき多くのポイント、
- ID:実施例番号の使用、最初から、のみ
- モジュール:インターフェイスモジュール
- case_name:用例名称
- 方法:要求タイプ
- URL:インターフェイスアドレス情報
- params:リクエストパラメータ
ケースのデザインさて、ここで私は3つの問題が発生しました:
まず:どのようにテストデータを読み込むには?
第二:テストデータの読み出しは、どのような形式に保存する必要がありますか?
3:どのようにデータを転送するには?
もちろん、より複雑なシーンのための設計例と、それは、ユースケースの失敗を回避するために、強すぎないの例との相関関係で、ユースケースの独立性を維持しようとすることが重要である、より多くの配慮だろう他のユースケースにつながります実行することはできません。
xlrd使用
、サードパーティのライブラリをインストールXlrd xlrd.fromのxlrdインポートopen_workbookをインストールPIP
WB = open_workbook( "TestData.xlsx") #オープンエクセル SH = wb.sheet_by_name( "登録")#ワークシートの位置決め 最初(リスト形式)のすべての値の印刷(sh.row_values(0))#ライン出力 を印刷(辞書(ZIP(sh.row_values(0) 、sh.row_values(1))))#の構成ヘッダとデータワード
範囲内のiについて(sh.nrows): プリント(sh.row_values(I))
Excelの包装作業を読む - どのようにテストデータを読み出すために?
次のようにコードは次のとおりです。
xlrdするインポートopen_workbook :クラスDoexcel() DEFのexcel_data_list(セルフ、ファイル名、シート名): DATA_LIST = [] WB = open_workbook(ファイル名)#オープンエクセル SH = wb.sheet_by_name(シート名)#配置ワークシート ヘッダ= sh.row_values( 0)を取得#行ヘッダデータ 範囲(1 iについて、sh.nrows ):#は、ヘッダー行をスキップし、2行目のデータ取得開始 col_datas =辞書を(ZIP(sh.row_values( 0)、sh.row_values( I)))#ヘッダと各ラインのデータは、辞書に組み込まれている 辞書のリストに追加data_list.append(col_datas)#を、ネストされた辞書のリストには、各要素に対応する辞書は、リスト(すなわちラインでありますデータ) DATA_LIST返す DEFのget_test_data(セルフ、DATA_LIST、CASE_IDを): '' ' :のparam DATA_LIST:すべてのデータ行のワークシートを :いくつかのケースの実行を決定するために使用されるIDを持つ場合、:CASE_IDをPARAM。IDは=全て、それはすべてのユースケースを実行する場合、そうでない場合、ユースケースで指定されたパラメータのリストを :リターン:最終テストを実行するためのリターン '' ' IF CASE_ID =='すべて': final_data = DATA_LIST 他: final_data = [] の項目DATA_LISTで: IF項目CASE_IDに[' ID「]: final_data.append(項目) 戻りfinal_data
もし__name__ == '__main__':
DATA_LIST = Doexcel()excel_data_list。( 'F:\ JialiProgramfile \ serviceX_API_Test \ Test_datas \ TestData.xlsx'、 '登録')
。final_data = Doexcel()get_test_data(DATA_LIST、[1,2、 3])
、印刷(final_data)
結果
[{ 'メソッド': '後'、 'expect_res':200.0は、 'actual_res': ''、 'ID':1.0、 'test_res': ''、 'case_name': 'test_register_normal'、 'URL':「HTTP ://27.154.55.14:8180 / API / fcb2bcrm / webRegister ' 'モジュール': ''、 'paramsはレジスタ':' { "LoginAccountを": "[email protected]"、 "パスワード": "123456"、 "タイプ": "プロ"}}、
{ 'メソッド': '後'、 'expect_res':400.0、 'actual_res': ''、 'ID':2.0、 'test_res': ''、 'case_name': 'test_register_existing'、 'URL': 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister'、 'モジュール': '登録'、 'のparams':「{ "LoginAccount": "[email protected]"、 "パスワード": "123456"、 "タイプ": "プロ"} '}、
{ 'メソッド': '後'、 'expect_res':400.0、 'actual_res': ''、 'ID':3.0、 'test_res': ''、 'case_name': 'test_register_invalid_email'、 'URL':「のhttp: //27.154.55.14:8180/api/fcb2bcrm/webRegister ' 'モジュール': '登録'、 'paramsは':' { "LoginAccount": "TEST01する@ gamil"、 "パスワード": "123456"、 "タイプ" :"プロ"}'}]
2.ddtデータ駆動型 - 転送データであれば?
データドリブン、個人的な理解は、パラメトリックテストデータであります
サードパーティのライブラリの1)インストール:DDTをインストールPIP
2)を導入DDTモジュール:DDTインポートDDTから、データ
DDT 3)test_register.pyコード
#インポート インポートunittestの インポート要求 のHttpRequest Common.http_requestインポートから インポートDDT DDTから、導入されたDDTデータモジュール# Common.do_excelインポート*から TEST_DATA = Doexcel()excel_data_list( 'F:\ JialiProgramfile \ serviceX_API_Test \ Test_datas \ TestData.xlsx' 「登録」)#は、すべてのデータワークシートレジスタを読んで、ネストされた辞書形式のリストを返す @ddtの クラスTestRegister(たunittest.TestCaseを):#クラスはテスト、継承のTestCaseで始まる必要があり DEFセットアップ(セルフ): 印刷( )「====== ======テストケースを実行するために始めた」 DEFティアダウン(自己): 印刷(「====== ======テストケースが終了する」) #テスト @データ(* TEST_DATA) DEF test_register(セルフ、data_itme):#はdata_itemあるテストデータの各セット(フォーム辞書) #送信要求 。RES =のHttpRequest()HTTP_REQUEST(data_itme [ 'URL']、evalのは(data_itme [ 'のparams'])、data_itme [ 'メソッド']) #がアサート: 試してみる: self.assertEqual(int型(data_itme [ 'expect_res']) 、res.status_code) AS EとAssertionErrorを除い: 印刷(「失敗」) 昇給のE番号の注目をスローする必要があります
3.試験結果が書き戻される - doExcelクラスを拡張します
実際の結果と試験結果:Excelスプレッドシートでは、二つの値は、ライトバックするためのテストケースを実行した後に必要とされているです。
write_back_result DEF(セルフ、ファイル名、シート名、行、actual_res、test_result): '' ' :のparamファイル名:ファイル名 :のparamシート名を:データテーブルをライトバック :PARAM行:ライトバックする行数 :PARAM actual_res:実際結果:(2,8)、(2,9)の結果は、実際の8,9のようなテストの結果、されている :PARAMのtest_result:試験結果:合格/失敗 :リターン: '' ' WB = load_workbook(ファイル名) WB =シート[シート名] sheet.cell(行,. 8).Valueの= actual_res sheet.cell(行,. 9).Valueの= test_result wb.save(ファイル名)
test_register.pyファイルにおいて、各完了実行からのテストデータのセットは、呼び出し に必要なパラメータを渡し、write_back_result()メソッド。
我々はすでに、パッケージ要求インターフェースを実現するために書かれたテストユニットテストフレームワークを達成したので、そのインターフェイスは、自動テストで完了することができ、それは高い再利用性ではありません。
我々は、各メソッド(テスト)コードは、想像データの各セットが書き込まれている場合我々のテストシナリオでは、登録インターフェースは、テストケースの数十ダースがあるかもしれない、ほとんど同じである参照します片道、そうではないだけで、効率が良く、高くないメンテナンスではない、より多くの重複コードが存在します。
次に、1)一緒にテストデータ管理と、データ駆動型のアプローチを使用して、フレームのために最適化されたパッケージを実行するテーブル、コードをエクセル、2)試験DDTを駆動するために、互いに独立した二つの部分。
1.データおよびコードの分離:Excelのテストデータ管理
、URL、paramsは、方法等をexpect_res、変更することが助長されていません。コードでは、test_register.pyモジュールは、テストデータのセットを提供するために必要な3つの方法(3つのテストケース)、各テストケースを定義しますそして今、私たちの新しいExcelファイル(TestData.xlsx)を構築し、。次のように:
ケースデザイン・オートメーション:
自動化されたテストケースのデザインは、より優れた自動化されたテストデータを設計するために、ビジネスプロセスを持つ唯一の馴染みのビジネスプロセスの使い慣れたインタフェースに基づいています。ここで考慮すべき多くのポイント、
- ID:実施例番号の使用、最初から、のみ
- モジュール:インターフェイスモジュール
- case_name:用例名称
- 方法:要求タイプ
- URL:インターフェイスアドレス情報
- params:リクエストパラメータ
ケースのデザインさて、ここで私は3つの問題が発生しました:
まず:どのようにテストデータを読み込むには?
第二:テストデータの読み出しは、どのような形式に保存する必要がありますか?
3:どのようにデータを転送するには?
もちろん、より複雑なシーンのための設計例と、それは、ユースケースの失敗を回避するために、強すぎないの例との相関関係で、ユースケースの独立性を維持しようとすることが重要である、より多くの配慮だろう他のユースケースにつながります実行することはできません。
xlrd使用
、サードパーティのライブラリをインストールXlrd xlrd.fromのxlrdインポートopen_workbookをインストールPIP
wb = open_workbook("TestData.xlsx") # 打开excel sh = wb.sheet_by_name("register") # 定位工作表 print(sh.row_values(0)) # 输出第1行的所有值(列表格式) print(dict(zip(sh.row_values(0),sh.row_values(1)))) # 将数据和标题组成字
for i in range(sh.nrows): print(sh.row_values(i))
封装读取excel操作 -如何读取测试数据?
实现代码如下:
from xlrd import open_workbook class Doexcel(): def excel_data_list(self, filename, sheetname): data_list = [] wb = open_workbook(filename) # 打开excel sh = wb.sheet_by_name(sheetname) # 定位工作表 header = sh.row_values(0) # 获取标题行的数据 for i in range(1, sh.nrows): # 跳过标题行,从第二行开始获取数据 col_datas = dict(zip(sh.row_values(0), sh.row_values(i))) # 将标题和每一行的数据,组装成字典 data_list.append(col_datas) # 将字典添加到列表中 ,列表嵌套字典,相当于每个字典的元素都是一个列表(也就是一行数据) return data_list def get_test_data(self, data_list, case_id): ''' :param data_list: 工作表的所有行数据 :param case_id: 用例id,用来判断执行哪几条case。如果id=all ,那就执行所有用例;否则,执行列表参数中指定的用例 :return: 返回最终要执行的测试用例 ''' if case_id == 'all': final_data = data_list else: final_data = [] for item in data_list: if item['id'] in case_id: final_data.append(item) return final_data
if __name__ == '__main__':
data_list=Doexcel().excel_data_list('F:\JialiProgramfile\serviceX_API_Test\Test_datas\TestData.xlsx','register')
final_data=Doexcel().get_test_data(data_list, [1,2,3])
print(final_data)
执行结果
[{'method': 'post', 'expect_res': 200.0, 'actual_res': '', 'id': 1.0, 'test_res': '', 'case_name': 'test_register_normal', 'url': 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister', 'module': 'register', 'params': '{"LoginAccount":"[email protected]","Password":"123456","Type":"Pro"}'},
{'method': 'post', 'expect_res': 400.0, 'actual_res': '', 'id': 2.0, 'test_res': '', 'case_name': 'test_register_existing', 'url': 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister', 'module': 'register', 'params': '{"LoginAccount":"[email protected]","Password":"123456","Type":"Pro"}'},
{'method': 'post', 'expect_res': 400.0, 'actual_res': '', 'id': 3.0, 'test_res': '', 'case_name': 'test_register_invalid_email', 'url': 'http://27.154.55.14:8180/api/fcb2bcrm/webRegister', 'module': 'register', 'params': '{"LoginAccount":"test01@gamil","Password":"123456","Type":"Pro"}'}]
2.ddt 数据驱动- 如果传递数据?
数据驱动,个人理解就是测试数据的参数化
1)安装第三方库 : pip install ddt
2)引入ddt模块:from ddt import ddt,data
3)test_register.py 代码加入ddt
# 导入 import unittest import requests from Common.http_request import HttpRequest from ddt import ddt,data # 引入ddt模块 from Common.do_excel import * test_data = Doexcel().excel_data_list('F:\JialiProgramfile\serviceX_API_Test\Test_datas\TestData.xlsx','register') #读取工作表 register 的所有数据 ,返回的是个列表嵌套字典格式 @ddt class TestRegister (unittest.TestCase): # 类必须以Test开头,继承TestCase def setUp(self): print("======开始执行测试用例======") def tearDown(self): print("======测试用例执行完毕======") # 测试用例 @data(*test_data) def test_register(self, data_itme): # data_item 就是每一组测试数据(字典的形式) # 发送请求 res = HttpRequest().http_request(data_itme['url'],eval(data_itme['params']),data_itme['method']) # 断言: try: self.assertEqual(int(data_itme['expect_res']), res.status_code) except AssertionError as e: print('Failed') raise e # 注意一定要抛出异常
3.测试结果写回 - 扩展doExcel类
在excel表格中,有 两列的值是需要在执行完测试用例后写回的:实际结果和测试结果。
write_back_result DEF(セルフ、ファイル名、シート名、行、actual_res、test_result): '' ' :のparamファイル名:ファイル名 :のparamシート名を:データテーブルをライトバック :PARAM行:ライトバックする行数 :PARAM actual_res:実際結果:(2,8)、(2,9)の結果は、実際の8,9のようなテストの結果、されている :PARAMのtest_result:試験結果:合格/失敗 :リターン: '' ' WB = load_workbook(ファイル名) WB =シート[シート名] sheet.cell(行,. 8).Valueの= actual_res sheet.cell(行,. 9).Valueの= test_result wb.save(ファイル名)
test_register.pyファイルにおいて、各完了実行からのテストデータのセットは、呼び出し に必要なパラメータを渡し、write_back_result()メソッド。