如题,举个例子,如 bbs 的发帖功能 UI 自动化,需要事先登录成功才能发帖。
请问是先调用登录的脚本再发帖吗?但这样违背 case 要独立的原则。
又或者可以把登录成功 case 的 cookie 写入文件,后面需要登录的 case 再从文件拿 cookie 进行操作?
类似的场景还有购物测删除商品,请问是事先在数据库添加好商品,再执行删除商品 case?
请问大家怎么解决这类问题的?
以上两幅截图均来自极客时间
谢谢。
登录、加商品属于用例的前置条件,应该放在 case 的 setup (beforeTest) 里面。这不违反 case 独立原则。
独立原则是每个 case 可单独被执行,在发贴的 case 里,登录必须是它的一部分,否则发贴的 case 无法独立执行
请问对购物车自动化,如果执行删除购物车商品的 case 需要先在 setup 里调用增加商品吗?抑或是在自动化开始前,准备好购物车里的商品数据以供删除商品的 case 使用?
我会把一个查询字段用 redis 缓存起来,再执行查询 - 修改/删除
极客时间的课程我也买了,可能我自己理解问题,感觉看完了,理论太多,没实践
第一个楼主纠结的应该不是独立性, 而是纠结一个 case 依赖的太多其他业务逻辑到底是不是好的。 其实你都已经是 UI 自动化了, 测试的就是系统集成, 这时候为啥还要避免这个情况呢。 case 尽量避免依赖这是单元测试的思路~ 所以才有各种 mock 技术么。
第二个就是测试数据到底是应该预先创建好的,还是实时调用系统功能来创建的。 看你们的情况了, 个人建议是团队水平不错就实时调用系统功能创建 (我们团队目前是这么做的),水平不好的就预先创建吧。
PS: 建议楼主现阶段尽量少看这些纯理论书,没啥好处。
我是觉得怎么方便怎么来吧,一般我是存起来用的时候就调用,过期了就再更新下
期待大神回答,对 UI 自动化,我也有类似的疑问,所谓的所有的 case 都必须是独立的,如果都写成独立的话,case 中就会有很多重复的步骤,请问这种大神们都是怎么解决的
其实这跟接口自动化测试也是类似的,可以参考下这个 https://testerhome.com/articles/18830
感谢回复~请问是指这样吗?
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
感谢回复~第一种方法,事先在数据库做好数据确实比较方便;第二种方法,调用数据库接口或者依赖其他 case 创建数据可能比较麻烦。不干测试,你养我吗?(周星驰脸 )
感谢回复~飞哥一语中的,我确实是在纠结 “一个 case 依赖的太多其他业务逻辑” 这个问题。请问实时调用系统功能创建数据指的是,在自动化时通过调用其他 case 来实时创建,是这个意思吗?
另,多谢飞哥建议。
不是调用其他 case, 就是你应该封装一个业务逻辑层。 case 是去调用业务逻辑层的东西的。 比如所有 case 都要登录,那就专门有个地方是写登录的逻辑的。 比如有很多的 case 在测试的时候依赖一些数据, 比如要测试查询订单那就要先有这个订单存在。 那么就可以专门有一个地方是封装的下单的逻辑。 理论上,case 要是精简的。 大部分的逻辑要封装到业务层里去。
想问一下大家,后台管理端添加成功与否,是否需要在前台验证呢?
是需要的,同步和异步刷新会出不少问题(这里要看你业务的刷新逻辑是什么和触发点 ,自动化都可以做)。客户端和服务器交互主要就是同步,如果没同步,客户端没有同步,又操作了别的并且应答了,就是连锁问题了。
我是这样做的,登录有一个单独模块,分开不同 case,比如登录成功,登录失败。然后其他业务需要调用到登录的时候,就直接调用登录成功的那个方法。所有测试的 case,都是从一而终,登录成功之后,从主界面一步步点击进入需要的路径,完成这条 case 就要退出登录,执行其他 case 的时候,也是一样的,需要登录就在 setup 里面加登录,teardown 里面加退出登录
我的做法是对业务分层;最基础的功能继承 unittest.TestCase,,比如注册;然后登录继承注册,获取个人信息又继承登录。这样一层层继承下去。每个业务场景的数据都是实时创建的。
将登陆封装为公共脚本进行调用呀
模块化
登陆放在 set_Up 里,
新增商品 case, 删除商品 case。 意思是在删除商品 case 里面 调用新增商品 case。 这种方式并没有解决依赖?
个人觉得,采用调用接口或者数据库里面直接在购物车表插入数据(当然关系表也要插入数据)。 这两种方式,是不是相对解决依赖。