接口自动化应该如何实现


接口业务用例的思考

有个问题思考很久,业务流程的自动化应该如何实现?是不是应该做十几个接口的业务测试?

咨询好些大佬,

A:看成果,有效果有时间都可以做。

B:业务流程的接口测试交给系统测试来做是不是会更好?

后者的话似乎有点让我自省~,我又反问他,那你这样说,接口的依赖你如何处理?

B:Mock解除依赖!

至此后,很久才明白。调用三方接口,Mock是个不错的选择

而大佬的话,是说用Mock解除所有的依赖问题,相应其实Mock后的数据都是假的数据,我不这样做,

但不反对这样的做法,因为有时前端在写代码时后端没有完成,也是通过Mock来解决的。而假数据就像在后端写死的验证码一样

其次,业务用例,投入与回报不一定成正比

所谓的集成测试,应看看重接口里的单元组合是否正确实现

只有接口调用时不得不解决所涉及的依赖问题,而形成接口之间的互相调用,这样构成的业务测试才是需要做的!

一条用例的自动化应该做什么!

 看起来简单的问题,实际上做起来没那么容易

举个例子:

账号、密码注册,测试注册成功

1、检查数据库是否存在该账号,有sql删除,没有跳过

2、传入参数调用注册接口,断言响应

3、sql删除该账号

处理接口测试之间的前置后置,可以使用接口、数据库方法解决,也可以混合

 

如何优雅

花了很多时间探索后才发现pageobject

元素层 + page层+ case层的相互调用似乎是已是标准

如何使用python  优雅的实现考验那个曾经为之努力的ceshiren

步骤:

 

①一起从case开始吧!

这是获取会员列表的正向case

参数分别是:页码、页数、排序方式、是否排序

实现接口调用,参数传入、获取响应、结果断言

怎么样优雅这个问题,在于page里方法的实现

   @pytest.mark.parametrize("case", ViplistData.case)
    @assert_logger
    deftest_viplist(self, case):
        """B端会员列表"""
        r = self.vip.viplist(pageindex=case['index'], pagesize=case['size'],
                             orderfield="createtime", ordertype=0)
        assert r.success is Truez

②page层

 什么是page?页面,页面下的功能点、方法,都归属这个页面

这样一来其实就对接口分了一下类,就比如会员下,有获取列表、新增会员、删除会员等

其实实现,无非就是传入数据给发送请求的方法而已

用了1个装饰器来重复造轮子,没错这很pythonic !

 

 

class Vip(WeShop_B):
    def __init__(self):
        self.apipath = YAML_DIR + r"\vip.yaml"
        self.apiyaml = self.api_yaml(file=self.apipath)

    @api
    def viplist(self, pageindex, pagesize,
                orderfield, ordertype) -> res:
        """
        获取pc会员列表
        :param pageindex: 当前页数 1
        :param pagesize: 一页数量  10
        :param orderfield: 排序字段  createtime
        :param ordertype: 排序(0-正序,1-倒序)
        :return:
        """
        pass
def api(func):
    @functools.wraps(func)
    def magic(self, *args, **kwargs):
        func(self, *args, **kwargs)
        base_api: Base = self
        method = func.__name__
        base_api.params.update({name: vaule for name, vaule in zip(func.__code__.co_varnames[1:0], args)
                                if args is not None})
        base_api.params.update(kwargs)
        req = base_api.api_yaml(file=base_api.apipath)[method]
        res = base_api.api_send(req)

写在最后:

元素层 1个yaml\json就要写 1个page。好像还是不够pythonic

有个思想很火,扫描一个yaml就生成对应的业务方法,这很美!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM