需求:
測試用例寫在類文件中,有個別用例方法(新增接口)需要做數據恢復,所以需要對此方法增加teardown步驟。
解決過程:
查看teardown使用方法:
- setup_method:僅作用於class用例集中的用例,置於class內,每個用例都會調用一次
- setup_function:作用於獨立的def用例,不可作用於class內的用例
- setup_class:作用於class用例集中的用例,置於class內,只在class用例執行的開始執行setup_class,結束時執行teardown_class
- setup_module:作用於模塊內的所有用例,置於class外,只在所以用例的開始執行setup_module,結束時執行teardown_module
發現沒有針對class中單獨的一個方法定制執行teardown,視線轉向fixture。
最終解決:
在類中編寫fixture方法,然后測試方法使用@pytest.mark.usefixture("fixture方法名稱")指定該用例方法去調用該固件。
class TestBasicConfiguration: @allure.severity('blocker') @allure.story("基礎配置模塊") @pytest.mark.smoke @pytest.mark.usefixtures("test_message_signatures_create_teardown") def test_message_signatures_create(self, get_case_info, mysql_op, log): """ 新增全局短信簽名功能驗證 :param get_case_info: 讀取用例信息 :param mysql_op: 數據庫連接 :param log: 日志實例 :return: """ # 獲取當前用例方法名,即json文件中的case_name case_name = sys._getframe().f_code.co_name # 獲取當前模塊名,用於在get_case_info中讀取對應的json用例文件 module_name = str(os.path.basename(__file__)).split('.')[0] print('模塊名稱為:{}'.format(module_name)) url, data, headers = get_case_info(case_name, module_name) res = requests.request("POST", url, data=data, headers=headers) print(res.json()) api_res_data = res.json()['code'] print('接口返回值為:{}'.format(api_res_data)) # 查詢新增的錯誤碼 data_sql = """SELECT t.sign_name FROM sms_center_uat.sms_global_sign t WHERE t.VALID_STATUS=1 AND t.sign_name='test2'""" mysql_op.execute_sql(data_sql) data = mysql_op.get_data() # mysql_op.close_db() db_query_data = data[0][0] print('數據庫查詢結果為:{}'.format(db_query_data)) try: assert api_res_data == "SUCCESS_REQUEST" and db_query_data == "test2" log.logger.info('場景:{}斷言成功'.format(case_name)) except AssertionError: err_msg = '場景:{0}接口斷言失敗,接口返回結果:{1} != 數據庫查詢結果{2}'.format(case_name, api_res_data, db_query_data) log.logger.error(err_msg) pytest.fail(err_msg) finally: log.logger.info('場景:{0}驗證完成'.format(case_name)) @pytest.fixture() def test_message_signatures_create_teardown(self, mysql_op): yield print("刪除新增的短信簽名") # 軟刪除新增的錯誤碼 data_sql = """UPDATE sms_center_uat.sms_global_sign t SET t.VALID_STATUS=0 WHERE t.VALID_STATUS=1 AND t.sign_name='test2'""" mysql_op.execute_sql(data_sql)