当Pytest遇上MVC分层设计自动化用例就该这么写
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 引子 数据写在代码里,追求快速编写用例,是我设计tep的一个特点,这在个人编写时是一种非常良好的体验。但相比于HttpRunner、JMeter等来说,总觉得还差点意思。思考良久,总结为三个字:工程化。工程化是我近一年在学习Java并参与了2个测试平台模块开发,和写了几个小工具后,感受到的一种编程思想。而其中最明显的就是Spring的MVC分层设计。为了让tep更工程化,后续版本将以MVC模块编写用例为准,同时会兼容之前的脚本式快速编写。 示例 目录结构 测试用例都放在一个文件夹下: test_case:用例主程序; steps:测试步骤; data:纯粹的json; 测试用例 test_case.py是测试用例,包含的只有测试步骤: import allure from examples.tests.LoginToPayFlow.steps.step_add_cart import step_add_cart from examples.tests.LoginToPayFlow.steps.step_order import step_order from examples.tests.LoginToPayFlow.steps.step_pay import step_pay from examples.tests.LoginToPayFlow.steps.step_search_sku import step_search_sku from utils.cache import TepCache from utils.step import Step """ 测试登录到下单流程,需要先运行utils/fastapi_mock.py """ @allure.title("从登录到下单支付") def test(login, env_vars, case_vars): case_vars.put("token", login["token"]) cache = TepCache(env_vars=env_vars, case_vars=case_vars) Step("搜索商品", step_search_sku, cache) Step("添加购物车", step_add_cart, cache) Step("下单", step_order, cache) Step("支付", step_pay, cache) TepCache是“缓存”,包括global_vars、env_vars、case_vars三个级别的变量池。 Step是一个泛化调用类,作用是打日志,调用第二个参数对应的步骤函数。 测试步骤 from utils.cache import TepCache from utils.func import data from utils.http_client import request def step_search_sku(cache: TepCache): url = cache.env_vars["domain"] + "/searchSku" headers = {"token": cache.case_vars.get("token")} body = data("查询SKU.json") response = request("get", url=url, headers=headers, params=body) assert response.status_code < 400 cache.case_vars.put("skuId", response.jsonpath("$.skuId")) cache.case_vars.put("skuPrice", response.jsonpath("$.price")) from utils.cache import TepCache from utils.func import data from utils.http_client import request def step_add_cart(cache: TepCache): url = cache.env_vars["domain"] + "/addCart" headers = {"token": cache.case_vars.get("token")} body = data("添加购物车.json") body["skuId"] = cache.case_vars.get("skuId") response = request("post", url=url, headers=headers, json=body) assert response.status_code < 400 cache.case_vars.put("skuNum", response.jsonpath("$.skuNum")) cache.case_vars.put("totalPrice", response.jsonpath("$.totalPrice")) 步骤函数以step开头,尤其注意的是cache借助Python Typing提示,可以在编写下面代码时,获得PyCharm语法提示,所以一定不要忘了加上: TepCache: ...