问答 请问大家自动化时数据依赖的解决方式?感谢

kent · 2019年04月17日 · 最后由 刘志鹏 回复于 2019年05月30日 · 4963 次阅读

如题,举个例子,如 bbs 的发帖功能 UI 自动化,需要事先登录成功才能发帖。
请问是先调用登录的脚本再发帖吗?但这样违背 case 要独立的原则。
又或者可以把登录成功 case 的 cookie 写入文件,后面需要登录的 case 再从文件拿 cookie 进行操作?

类似的场景还有购物测删除商品,请问是事先在数据库添加好商品,再执行删除商品 case?
请问大家怎么解决这类问题的?


以上两幅截图均来自极客时间
谢谢。

共收到 26 条回复 时间 点赞
kent #25 · 2019年04月18日 Author
陈恒捷 回复

感谢回复~

kent #24 · 2019年04月18日 Author
陈恒捷 回复

请问对购物车自动化,如果执行删除购物车商品的 case 需要先在 setup 里调用增加商品吗?抑或是在自动化开始前,准备好购物车里的商品数据以供删除商品的 case 使用?

kent 回复

删除商品应该和添加商品放到一个流程里去做

  • 我觉得理论上第一种比较好:把一些数据直接做到数据库里面,直接获得到测试场景,进行测试; 但是要调用登录这个操作, 应该是无法避免, 也没有必要避免;
  • 但是如果你用了什么不支持封装的工具(应该是没有源码或是你自己不会改),或是数据库确实比较复杂,两条路都走不通的话, 那只能自认倒霉了。最后的效果就是: 为了造一个场景,前面先调 10 多个接口;为了数据干净,又调 10 多个接口造基础数据; 然后得到一个后期没法维护的东西
  • 避免上面的另外一种方法是赶上一个胡了把土的领导,ta 自己只会动嘴, 根本不管你怎么测的.
  • 终极的方法是不干测试.

我会把一个查询字段用 redis 缓存起来,再执行查询 - 修改/删除

极客时间的课程我也买了,可能我自己理解问题,感觉看完了,理论太多,没实践

我是觉得怎么方便怎么来吧,一般我是存起来用的时候就调用,过期了就再更新下

期待大神回答,对 UI 自动化,我也有类似的疑问,所谓的所有的 case 都必须是独立的,如果都写成独立的话,case 中就会有很多重复的步骤,请问这种大神们都是怎么解决的

王加 回复

其实这跟接口自动化测试也是类似的,可以参考下这个 https://testerhome.com/articles/18830

kent #9 · 2019年04月20日 Author
徐汪成 回复

感谢回复~请问是指这样吗?

import pytest

@pytest.fixture(scope="class",autouse=True)
def preclass():
    print('登录')
    yield
    print("关闭driver")

class TestShoppingCart():

    @pytest.mark.run(order=1)
    def test_insert_porduct(self):
        '''
        添加商品
        :return:
        '''
        print('添加')
        assert 1 == 1

    @pytest.mark.run(order=2)
    def test_delete_product(self):
        '''
        删除商品
        :return:
        '''
        print('删除')
        assert 1 == 1

kent #10 · 2019年04月20日 Author
hellohell 回复

感谢回复~第一种方法,事先在数据库做好数据确实比较方便;第二种方法,调用数据库接口或者依赖其他 case 创建数据可能比较麻烦。不干测试,你养我吗?(周星驰脸😂

kent #11 · 2019年04月20日 Author
rhyme 回复

感谢回复~确实是理论偏多,实践较少,看了一部分有些浅尝辄止的感觉😁

kent #22 · 2019年04月20日 Author
孙高飞 回复

感谢回复~飞哥一语中的,我确实是在纠结 “一个 case 依赖的太多其他业务逻辑” 这个问题。请问实时调用系统功能创建数据指的是,在自动化时通过调用其他 case 来实时创建,是这个意思吗?
另,多谢飞哥建议。✍

kent #7 · 2019年04月20日 Author

感谢回复~怎么爽怎么来,这样不知道框架越写到后面会慢慢变乱 😅

kent #17 · 2019年04月20日 Author
debugtalk 回复

好的,拜读!👍

kent 回复

不是调用其他 case, 就是你应该封装一个业务逻辑层。 case 是去调用业务逻辑层的东西的。 比如所有 case 都要登录,那就专门有个地方是写登录的逻辑的。 比如有很多的 case 在测试的时候依赖一些数据, 比如要测试查询订单那就要先有这个订单存在。 那么就可以专门有一个地方是封装的下单的逻辑。 理论上,case 要是精简的。 大部分的逻辑要封装到业务层里去。

想问一下大家,后台管理端添加成功与否,是否需要在前台验证呢?

cheunghr 回复

是需要的,同步和异步刷新会出不少问题(这里要看你业务的刷新逻辑是什么和触发点 ,自动化都可以做)。客户端和服务器交互主要就是同步,如果没同步,客户端没有同步,又操作了别的并且应答了,就是连锁问题了。

我是这样做的,登录有一个单独模块,分开不同 case,比如登录成功,登录失败。然后其他业务需要调用到登录的时候,就直接调用登录成功的那个方法。所有测试的 case,都是从一而终,登录成功之后,从主界面一步步点击进入需要的路径,完成这条 case 就要退出登录,执行其他 case 的时候,也是一样的,需要登录就在 setup 里面加登录,teardown 里面加退出登录

我的做法是对业务分层;最基础的功能继承 unittest.TestCase,,比如注册;然后登录继承注册,获取个人信息又继承登录。这样一层层继承下去。每个业务场景的数据都是实时创建的。

将登陆封装为公共脚本进行调用呀

模块化

登陆放在 set_Up 里,

debugtalk 回复

新增商品 case, 删除商品 case。 意思是在删除商品 case 里面 调用新增商品 case。 这种方式并没有解决依赖?

个人觉得,采用调用接口或者数据库里面直接在购物车表插入数据(当然关系表也要插入数据)。 这两种方式,是不是相对解决依赖。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册