zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/gcgc/p/12761912.html
Copyright © 2011-2022 走看看