Tep 支持 MVC 架构实现用例数据分离

2025-05-29 0 53

Tep 支持 MVC 架构实现用例数据分离

大家好,我是刚哥。

tep已经支持了两种开发模式:用例数据一体和HttpRunner(第三版)。HttpRunner已经众所周知,此处不做过多介绍。用例数据一体指的是把用例和数据都写在一个test.py文件里面,这样的好处是简单直接明了,特别适合刚开始用pytest写自动化代码的同学,从上往下一气呵成就完成了一个自动化用例,收获成就感的同时,也能很方便的共享给其他人使用,单个文件就能跑起来。

但是当我在公司用SpringBoot开发了一个后端服务后,尝到了MVC架构所带来的高可维护性,加上在跟各位大佬聊天时,也听说很多公司对接口自动化做了分层设计,于是让tep支持用例数据分离的开发,已经变得很重要了。用例数据分离指的是用例只有逻辑没有数据,这样在修改数据的时候,用例基本不需要变化就能适应,用例看起来是非常简洁的,就像这样:

  1. classTest:
  2. case_vars=TepVars()
  3. case_vars.vars_={
  4. "domain":"http://127.0.0.1:5000",
  5. "skuNum":"3"
  6. }
  7. deftest(self):
  8. #登录
  9. Login(Test).post()
  10. #搜索商品
  11. SearchSku(Test).get()
  12. #添加购物车
  13. AddCart(Test).post()
  14. #下单
  15. Order(Test).post()
  16. #支付
  17. Pay(Test).post()

这就是tep支持的用例数据分离的用例的样子。

我增加了一个services文件夹,用于存放接口:

Tep 支持 MVC 架构实现用例数据分离

先看下登录Login.py:

  1. classLogin(BaseRequest):
  2. defpost(self):
  3. response=self.request(
  4. "post",
  5. url=self.case_vars.get("domain")+"/login",
  6. headers={"Content-Type":"application/json"},
  7. json={
  8. "username":"dongfanger",
  9. "password":"123456",
  10. }
  11. )
  12. assertresponse.status_code<400
  13. self.case_vars.put("token",response.jmespath("token"))
  • 必须继承BaseRequest。
  • self.request和requests.request用法完全一致。
  • self.case_vars用于在测试用例的测试步骤之间传递变量,有get和put两个操作。
  • response.jmespath("token")是封装了requests.Response后添加的方法,替代jmespath.search("token", response.json())的写法。

BaseRequest的定义如下:

  1. importjmespath
  2. fromrequestsimportResponse
  3. fromtep.clientimportrequest
  4. classTepResponse(Response):
  5. def__init__(self,response):
  6. super().__init__()
  7. fork,vinresponse.__dict__.items():
  8. self.__dict__[k]=v
  9. defjmespath(self,expression):
  10. returnjmespath.search(expression,self.json())
  11. classBaseRequest:
  12. def__init__(self,clazz):
  13. self.case_vars=clazz.case_vars
  14. defrequest(self,method,url,**kwargs):
  15. response=request(method,url,**kwargs)
  16. returnTepResponse(response)
  • TepResponse对requests.Response做了封装,添加了jmespath方法。
  • BaseRequest的__init__在初始化时传入测试类(test.py里面测试用例的类),提取case_vars对象,这样接口类继承以后,就能用self.case_vars来get和put变量了。
  • 同时调用tep.client.request,并把response以封装后的TepResponse返回。

那么问题来了,如何在接口之间传递参数呢?请看test_login_pay_mvc.py、Login和SearchSku这三段代码:

  1. #test_login_pay_mvc.py
  2. classTest:
  3. case_vars=TepVars()
  4. case_vars.vars_={
  5. "domain":"http://127.0.0.1:5000",
  6. "skuNum":"3"
  7. }
  8. deftest(self):
  9. #登录
  10. Login(Test).post()
  11. #搜索商品
  12. SearchSku(Test).get()
  13. #添加购物车
  14. AddCart(Test).post()
  15. #下单
  16. Order(Test).post()
  17. #支付
  18. Pay(Test).post()
  1. #Login.py
  2. classLogin(BaseRequest):
  3. defpost(self):
  4. response=self.request(
  5. "post",
  6. url=self.case_vars.get("domain")+"/login",
  7. headers={"Content-Type":"application/json"},
  8. json={
  9. "username":"dongfanger",
  10. "password":"123456",
  11. }
  12. )
  13. assertresponse.status_code<400
  14. self.case_vars.put("token",response.jmespath("token"))
  1. #SearchSku.py
  2. classSearchSku(BaseRequest):
  3. defget(self):
  4. response=self.request(
  5. "get",
  6. url=self.case_vars.get("domain")+"/searchSku",
  7. headers={"token":self.case_vars.get("token")},
  8. params={"skuName":"电子书"}
  9. )
  10. self.case_vars.put("skuId",response.jmespath("skuId"))
  11. self.case_vars.put("skuPrice",response.jmespath("price"))
  12. assertresponse.status_code<400
  • test_login_pay_mvc.py文件的Test测试用例里面,定义了用例级别的变量:domain。
  • Login.py文件通过self.case_vars.get("domain")获取domain,然后把token通过self.case_vars.put("token", response.jmespath("token"))存入token。
  • SearchSku.py文件通过self.case_vars.get("token")获取token,并用self.case_vars.put()存入skuId和skuPrice,供下一个接口AddCart使用,以此类推。

用例数据分离的写法遵从了MVC架构,并借鉴了HttpRunner和JMeter的部分设计,相比于用例数据一体,可能编写体验没有那么方便,但是维护性和可复用性都很高,其中接口类的get和post可以根据数据需要定义多个如get_a和post_b等,以支持多种数据,略微有一丢丢复杂,适合有代码经验的同学。

如何才能使用用例数据一体、用例数据分离、HttpRunner3种开发模式呢?等tep0.9.4版本发布后进行升级,用tep startproject demo命令创建项目脚手架,就会包含登录到下单流程的全部3种开发模式示例代码,开箱即用,一键运行成功。

从此刻开始,tep实用性已经提升了一个档次,但是我将停下它的脚步,将注意力放到HttpRunner3的源码学习中,并产出一系列文章,站在巨人的肩膀上,才能看得更远。为什么HttpRunner如此重要?因为毕竟tep的技术就是从HttpRunner学来的。

原文链接:https://mp.weixin.qq.com/s/ExosXovOvLoxcCNcAJZ5ZA

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Tep 支持 MVC 架构实现用例数据分离 https://www.kuaiidc.com/89931.html

相关文章

发表评论
暂无评论