测试 关于集成测试的数据库等

5swords · July 17, 2014 · Last by billy replied at July 17, 2014 · 2693 hits

没做过集成测试,不是很懂自动化测试的知识,碰到些问题,请各位指教。

1、数据库的基础,大家在什么数据库的基础上开始?是空的库还是有一个基础数据的数据库?

2、数据库的生成,在基础库上用什么方式导入数据?应该可以在测试脚本里调吧。 A: rake db:seed B: rails r script/xx.rb C: factory girl D: 还是有专门的 gem? E: 还是自己写?

3、数据库的复原,测试结束,回到基础库,为下一个测试作准备。用什么方式复原?用 transaction?或是除了几个特定的表外全删除。

4、一份数据能否连续测试? A: 可以,数据来之不易,而且如果模拟用户的操作的话,数据也有一定的连续性。比如说 crud 里的创建、查询、变更、查询、删除、查询这样测试下来。 B: 不可以,每个 case 不管是否有关系,必须从基础库开始,在给定的数据环境下测试并得出结果。

----------------- 有没有这方面比较好的资料,不一定是 rails 相关的。

  1. 都可以。空数据库就用 FactoryGirl 或类似,基础数据的就是 Rails 传统的 fixture。
  2. 生成。fixture 是在 yml 里面事先定义好所有的。FactoryGirl 有专门的 DSL 生成,看文档就知道了。
  3. 复原。我是用 database cleander 和 FactoryGirl 搭配,在 spec_helper 或者 test_helper 里面定义。用 truncation 策略。
  4. 不可以。Example 之间必须清空。CRUD 不算严格的集成测试,只能算功能测试,是必须清空的。但在做模拟用户的集成测试时,为保证连续性,可以在一个 example 里面执行多个步骤。

#1 楼 @billy 谢谢宝贵的经验! 测试书上单元测试很详细也比较简单,集成测试的比较少,感觉水比较深。 照我的理解,除了基础数据(上线时必须导入的数据)外,其它的所有数据都应该是用户操作生成的最好。

@5swords 不客气。集成测试其实成本比较高,一个方面是慢,另一个方面是维护很耗时。我觉得除非实在必要,否则尽量少写。

数据方面,只有本测试有直接关系的才需要用户生成。比如要求是填一个表单,提交后在界面上看到相应效果。这个表单的数据就需要模拟用户行为。其他数据只能在后台生成,没法都过 GUI, 否则一个个过 GUI 那个时间你是会吐血的,而且测试之间耦合太高。

#3 楼 @billy 集成测试我觉得有一些耦合是可以的,问题还是数据。假设 case 间的关系应该是树状的。

case1
  case1-1
    case1-1-1
    case1-1-2
  case1-2
case2
  case2-1
  case2-2

如果可以把 log 里的增改删过滤出来形成与 case 相关的增量数据临时文件,由接下来的 case 使用,那就可以实现所有的数据都是 GUI 产生的。

switch.rb, 深度优先

on case1
fork run case1 cause no dependencies
on case1-1 depend on case1.data
push case1-1 wait on case1.data ready
on case 1-1-1 depend on case1-1.data
push case1-1-1 wait on case1-1.data ready
on case1-2 depend on case1.data
push case1-2 wait on case1.data ready
on case2
fork run case2  cause no dependencies
on case2-1 depend on case2.data
push case2-1 wait on case2.data ready
on case2-2 depend on case2.data
push case2-2 wait on case2.data ready
...
event on case1.data ready
fork run case1-1
fork run case1-2
event on case2.data ready
fork run case2-1
fork run case2-2
event on case1-1.data ready
fork run case1-1-1
fork run case1-1-2

@5swords 你多虑了:) 真没必要想得这么复杂。

关于耦合,我举个例子吧,测试用户发帖功能。这个测试肯定要求用户是已经登录的,通常做法就是一个快速的 session helper 模拟登录,不会去跑过登录界面。那样一个是费时,二个就是耦合。登录部分出错并不意味着发帖也有问题。但是过 GUI 的话两个测试都会出错。另外,要过 GUI 就意味着你必须先写写好完登录的代码,而不能团队里一人写登录,一人写发帖,或者先写发帖。

卷起袖子先写吧,具体问题具体分析。总是会越写经验越丰富的。

You need to Sign in before reply, if you don't have an account, please Sign up first.