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

kent · April 17, 2019 · Last by 刘志鹏 replied at May 30, 2019 · 2287 hits

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

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


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

共收到 26 条回复 时间 点赞
kent #2 · April 18, 2019 作者
陈恒捷 回复

感谢回复~

kent #3 · April 18, 2019 作者
陈恒捷 回复

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

kent 回复

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

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

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

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

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

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

王加 回复

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

kent #12 · April 20, 2019 作者
徐汪成 回复

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

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 #13 · April 20, 2019 作者
hellohell 回复

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

kent #14 · April 20, 2019 作者
CY 回复

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

kent #15 · April 20, 2019 作者
孙高飞 回复

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

kent #16 · April 20, 2019 作者

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

kent #17 · April 20, 2019 作者
debugtalk 回复

好的,拜读!👍

kent 回复

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

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

cheunghr 回复

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

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

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

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

模块化

登陆放在set_Up里,

debugtalk 回复

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up