作者 内容
 will_lin   困扰我很久的关于测试用例的问题,请大家帮我出出主意
 

在一个MVC模式的系统架构下,只有实体类需要与持久层交互,其测试用例需要构造测试数据环境,而上层的业务逻辑类、控制类不直接与数据库交互。
我用几个JdbcFixture来生成|删除测试数据。各个testCase都基于这些数据来运行。
我的问题出在:
1、执行每个Case之前都要重新生成一遍,执行之后再将这些数据清掉。团队中有很多人对此很有意见,认为这是对资源的浪费。有没有办法能够尽量利用资源,又可以避免由此带来的测试用例的执行顺序不同对测试结果的影响?;
2、开发过程中执行测试用例时,有些测试会影响到公用数据,这样就会影响其他小组正在执行的测试结果,如何避免这种影响呢?

BTW,我用的是Junit3.8

 04/05/10 11:04 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  每一个测试都是独立的
 

每一个单元测试都有独立的输入和输出。fixture是每个测试的运行平台。好的设计就是容易测试的设计,容易测试也包括了容易创建fixture,fixture需要占用的资源少。您的所有类的单元测试都需要连数据库吗?如果您感觉单元测试的开销太大,甚至于大到使之成为不可能的事,那么您的设计是有问题的。

具体看您的问题:

1、执行每个Case之前都要重新生成一遍,执行之后再将这些数据清掉。团队中有很多人对此很有意见,认为这是对资源的浪费。有没有办法能够尽量利用资源,又可以避免由此带来的测试用例的执行顺序不同对测试结果的影响?

这种浪费到了不能忍受的程度了?那设计有问题。也许很多类不需要连数据库就能测试?也许提供一个MockDB或提供一个MemoryStore来代替JdbcStore就能测试?每个测试都需要自己的fixture或基底数据,在测试运行前都需要清理干净这个“测试床”,这是原则。


2、开发过程中执行测试用例时,有些测试会影响到公用数据,这样就会影响其他小组正在执行的测试结果,如何避免这种影响呢?

这个问题和上面一个问题一样,每次都测试都需要从一个已知的确定状态出发,预期测试运行后得到确定的状态。如果不能确定测试开始时系统的状态,那么也不能预期测试结束时系统的状态,测试也就无效了。

听说微软在做SQL Server的测试时,有一些测试是从安装一个干净的操作系统开始的。当然,这种fixture的设置是自动化的。

 04/05/10 17:45 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 will_lin  回复: 每一个测试都是独立的
 

您的提议(“提供一个MockDB或提供一个MemoryStore来代替JdbcStore”)确实值得我一试!
具体到我的设计是这样的:只有实体类需要跟数据库打交道,而业务逻辑类是只跟实体类以及其他业务逻辑类打交道的。主要困扰我的其实就是对业务逻辑类测试时要做的测试环境的构造和清理。
谈到Fixture,您说的“每个测试都需要自己的fixture或基底数据”是否意味着Fixture很难做成一个公用的(至少是被一些类公用的)呢?

另外,MemoryStore有没有现成的软件可用?

 04/06/03 09:59 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 sealw  TestCase可以有自己的继承结构
 

假设你用的是JUnit做单元测试,那么一般的做法是写一个测试类,从TestCase派生,并在这个类的setUp方法中设定Fixture.

Public class BasicDataFixtureTest extends TestCase {
public void setUp() throws Exception {
......
}
......
}

你可以有这样的Test类层次结构,
Public class MoreDataFixtureTest extends BasicDataFixtureTest {
public void setUp() throws Exception {
super.setUp();
......
}
......
}

还可以有
Public class MuchMoreDataFixtureTest extends MoreDataFixtureTest {
......
}

MemoryStore或MockStore之类一般都是自己写的,没有别人替你写好的. MemoryStore可能把对象都存在一个Vector里,实现Store要求的所有操作,就是不做持久.而MockStore只是mock Store的接口,许多动作都不做,甚至也不把对象存在Vector中.

 04/06/03 21:39 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首
 will_lin  非常感谢,我将试一试您所说的测试方法~~
 
 04/06/08 14:38 酷帖!    臭帖!    回复  
酷帖评价:           臭帖评价:
返回页首