pytest:使用@pytest.mark.usefixtures()給寫在類中的方法增加teardown步驟


需求:

  測試用例寫在類文件中,有個別用例方法(新增接口)需要做數據恢復,所以需要對此方法增加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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM