Python接口自动化测试框架【五】

本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/113551411

前面已经分享四篇了,第一篇第二篇第三篇第四篇,继续;

在这里插入图片描述

接口自动化测试框架的 category,有兴趣,可以看看。

个人博客:https://blog.csdn.net/zyooooxie

需求

使用pytest 如何做测试用例的设计?

conftest.py


@pytest.fixture(scope='session')
def session_host():
    warnings.simplefilter('ignore', ResourceWarning)
    env = 'test'
    s = LoginLogout(env=env)
    req_session, req_host = s.login()

    yield req_session, req_host

    s.logout(req_session)

test_balance.py


gl_excel_data = ExcelConfig.read_excel(os.path.join(excel_dir, 'new1.xlsx'), sheet_index=0)
Log.info('excel读取数据:{}'.format(gl_excel_data))

excel_data = [g for g in gl_excel_data if g[9] == '' and g[10] == '']
Log.info('执行用例:{}'.format(excel_data))


# noinspection PyAttributeOutsideInit
class TestBalance(object):

    def setup_class(self):
        self.db, self.cur = CommonFun.connect_db(db_name='balance_db')

    def teardown_class(self):
        CommonFun.disconnect_db(self.db, self.cur)

    @pytest.mark.parametrize('data', excel_data)
    def test_b_1(self, session_host, data):
        Log.info(data)

        session, host = session_host

        data_feature, data_story, data_title, data_url, data_method, data_req_data, data_res_data, data_remark, data_description, data_setup, data_teardown, data_sql, data_need_s_t = data

        allure.dynamic.feature(data_feature)
        allure.dynamic.story(data_story)
        allure.dynamic.title(data_title)
        allure.dynamic.description(data_description)

        if isinstance(data_need_s_t, float):
            if int(data_need_s_t) == 0:
                Log.info('当前用例 不需要前置、后置')
                setup_case, teardown_case = list(), list()
            else:
                raise Exception('前后置 传参不合法')

        elif data_need_s_t == '':
            Log.info('当前用例 不需要前置、后置')
            setup_case, teardown_case = list(), list()

        elif isinstance(eval(data_need_s_t), list):
            setup_case, teardown_case = eval(data_need_s_t)
            Log.info('当前用例需要前置:{}、后置:{}'.format(setup_case, teardown_case))

        else:
            raise Exception('前后置 传参不合法')

        for s in setup_case:
            set_up_case = [u for u in gl_excel_data if u[9] == s]
            if len(set_up_case) != 1:
                raise Exception('前置case 数据量不对: {}'.format(set_up_case))
            feature, story, title, url, method, req_data, res_data, remark, description, setup, teardown, sql, need_s_t = set_up_case[0]
            self.run_case(session, host, url, method, req_data, res_data, remark, sql, setup_teardown='setup')

        self.run_case(session, host, data_url, data_method, data_req_data, data_res_data, data_remark, data_sql)

        for t in teardown_case:
            tear_down_case = [x for x in gl_excel_data if x[10] == t]
            if len(tear_down_case) != 1:
                raise Exception('后置case 数据量不对: {}'.format(tear_down_case))
            feature, story, title, url, method, req_data, res_data, remark, description, setup, teardown, sql, need_s_t = tear_down_case[0]
            self.run_case(session, host, url, method, req_data, res_data, remark, sql, setup_teardown='teardown')

    def run_case(self, session, host, url, method, req_data, res_data, remark, sql, setup_teardown=None):
        if setup_teardown == 'setup':
            Log.info('前置 执行')
        elif setup_teardown == 'teardown':
            Log.info('后置 执行')
        else:
            Log.info('测试用例 run')

        new_url = ''.join([host, url])

        if remark != '':                    # 修改req_data
            new_req_data = CommonFun.change_excel_paramsValue_new(remark, req_data)

        else:                               # 不修改req_data
            new_req_data = None if req_data == '' else json.loads(req_data)

        new_res_data = CommonFun.change_excel_assertValue(res_data)

        res = SessionSendReq(session=session).req(test_url=new_url, request_type=method, test_data=new_req_data)

        # Log.info(dump.dump_all(res).decode('utf-8'))

        if sql == '':
            CommonFun.assert_fun(new_res_data, res)
        else:
            CommonFun.sql_assert_fun(res_data, sql, res, self.db, self.cur)


if __name__ == '__main__':
    pytest.main(['-s', 'test_balance.py'])

这部分代码:

  1. pytest 识别 test_cases目录下的conftest.py;
  2. fixture的scope=‘session’,可以跨py文件;
  3. 参数化,用例执行;

在这里插入图片描述

这篇就主要这些内容;该系列第六篇 接口自动化框架之 allure生成报告

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/113551411