是这样的,我用 robotium 进行很初级的自动化测试,代码中我分成了 test1、test2、test3 几个函数,然后 robotium 会自动按顺序执行下去,但是我发现一个问题,test1 用例执行完毕后,进行 test2 用例没有问题,但是,robotium 的 test2 用例是基于 test1 跑的。。。我 test1 完成了一个场景,我想在 test2 上重新跑 test1 的内容,继而在加上 test2 自己的内容,说白了就是想重新再跑一遍,但是 robotuim 不是这么实现的,在跑 test2 的时候直接就是基于 test1 跑完的场景下才进行的,这个有大侠们遇到过么。
#8 楼 @testblue 这么说吧,正常自动化测试用例的执行套路是:
setUp()
test1()
tearDown()
setUp()
test2()
tearDown()
...
setUp 和 tearDown 是由测试框架(如 Junit,testng)提供的固定方法,默认什么都不做。而你想要达到的相互不影响,应该是在 setUp 和 tearDown 里操作。
还是举前面注册和登录的例子吧:
setUp:打开应用
test1():注册用户
tearDown:删除用户并关闭应用
setUp:打开应用
test2():注册用户并登录
tearDown:删除用户并关闭应用
要消除 test1 的效果,应该在 tearDown 里面做。这也是上面其他同学提到的 “case 之间解耦” ,即无论测试集中的 test1 用例通过或失败,test2 用例都不会受到影响。
case 之间要解耦,把你的 test1/test2/test3 分开写成不同的类,每个 case 运行完需要做数据清理
#1 楼 @chenhengjie123 您说的非常对,我要的就是这个效果,跑完 test1 以后不会影响跑 test2,就是完全独立的,为什么我想要这样的效果,因为我每次跑完一个用例再跑下一个的时候我要保证数据是完全干净的,必须要重新开始,而 robotium 貌似默认就直接接着 test1 跑了,很是伤脑筋
每个用例都有 setUp() 和 tearDown() 这两个方法,setUp() 在用例执行前被调用,这里可以写一些测试的准备动作,如启动某个 activity;tearDown() 在用例执行后被调用,如退出 app。所以,每个用例是否被其它用例影响,可以通过这两个方法来决定。
这个我觉得不是 robotium 的问题吧。按照顺序来说,你的 test1 跑完,然后继续跑 test2 ,此时 test1 的遗留效果还在,这很正常吧。
我猜你想要的是 test1 跑完就整个 app 重置,然后 test2 跑的时候相当于是重新启动 app 来跑的?举个例子,test1 注册了用户,test2 是注册并登录这个用户,所以 test1 跑完后 test2 注册就会出错(这个用户已经注册过),而你需要的效果是 test1 跑完的遗留效果和没跑过(即没有注册过用户)一样?
#9 楼 @chenhengjie123 烦请问在 tearDown 中如何消除以上用例产生的效果呢,很是困扰
#12 楼 @chenhengjie123 大神不会遇到这种问题吗,感觉都会遇到的,解决方法应该是和大家一样的,只是业务层面各不相同,我只是想 1、12、123 这样执行。。。
第一,我觉得你需要转变一下思维方式,自动化测试中要求每个用例都是独立的,和手工测试的各个用例之间还能有耦合度不一样。这是前提。
第二,怎么把原来手工测试中具有耦合度的用例在自动化测试中解耦执行,其实不难。你转换一下,把原来手工的一个用例看成是自动化中的一个类。自动化用例就是这些类里面的操作的组合。
第三,至于怎么做 teardown ,我举个简单例子吧。例如 1s = 1 的 setup 中执行的内容,1t = 1 的 teardown 中执行的内容,那么执行 b(包含 12)这个用例时,实际执行顺序可以调整成 bs(即 1s)->1->2->bt(即 1t->2t) 。至于 1t 或者 2t 写什么,你就看你具体需要咯。
#14 楼 @chenhengjie123 您举得例子我看半天,好晕。。。不过我知道了这种情况应该不是简单用代码去调控,应该换个思维,谢谢~
#9 楼 @chenhengjie123 非常非常感谢!!!!!