Junit4提供了两种测试场景的准备与恢复方式,@BeforeClass,@AfterClass和@Before,@After。一般来说测试场景的准备与恢复就是在运行测试方法前准备测试数据,运行完成后再回收这些测试数据以使测试场景恢复到测试前的状态。下面先看看分别使用这两种方式的区别,请看下面的测试脚本框架:
第一种方式(@BeforeClass和@AfterClass):
public class SomeClassTest {
@BeforeClass
public static void beforeClass(){
//在这里准备场景数据(1)
}
@AfterClass
public static void afterClass(){
//在这里恢复场景数据(2)
}
@Test
public void testSomething1(){
//第一个测试方法,在这里编写要测试的东西(3)
}
@Test
public void testSomething2(){
//第二个测试方法(4)
}
}
请看其中的序号,使用这种方式准备数据的时候脚本的执行顺序是这样的:(1)→(3)→(4)→(2),使用这种方式来准备数据和恢复数据的时候是一次性的,即在该测试类的所有测试方法执行前加载一次数据,在所有测试方法执行后恢复一次数据。
第二种方式(@Before和@After):
public class SomeClassTest {
@Before
public void before(){
//在这里准备场景数据(1)
}
@After
public void after(){
//在这里恢复场景数据(2)
}
@Test
public void testSomething1(){
//第一个测试方法,在这里编写要测试的东西(3)
}
@Test
public void testSomething2(){
//第二个测试方法(4)
}
}
使用第二种方式准备数据的时候脚本的执行顺序是这样的:(1)→(3)→(2)→(1)→(4)→(2),使用这种方式来准备数据和恢复数据的时候,会在该测试类的每个测试方法执行前加载一次数据,然后在每个测试方法执行后恢复一次数据。总而言之,前一种方式是类级别的,而后一种是方法级别的。
很显然,第一种场景准备与恢复方式的执行效率肯定高于第二种方式的执行效率,并且一个测试类里的测试方法越多这种差别越大。在测试脚本的执行中,我为什么会想到数据加载的执行效率呢?因为在运行测试脚本的过程中我发现,很多时候采用第一种方式一次性准备数据,一个测试方法的执行时间大概只有几毫秒;而使用第二种方式的执行时间通常都是在秒级别的,因为每个方法执行前后都要有一次数据准备与恢复操作,不仅耗时(单从每个测试方法的执行效率来看,差别是上千倍的)而且频繁的数据库操作也大大增加了出错的几率。
于是在测试脚本的编写过程中,数据的准备与恢复我都尽量采用第一种方式,but古语有云:有所得,必有所失;有所失,必有所得。就这两种方式而言,第一种虽然执行效率高,但是不安全,因为它的数据是一次性准备的,那么在执行前一个测试方法的时候可能对这些数据造成了一些更改,而这些更改对于后续的测试方法来说是不期望的,也就是对后面的测试方法造成了场景数据的污染,使得后续的测试方法执行失败。而相对于第一种方式来说,第二种方式就安全多了,因为它可以保证每个测试方法执行的时候用的都是我们所准备的场景数据。
那么,我们该怎么解决这个矛盾呢?原则还是不变,尽量使用类级别的数据准备与恢复方式。请注意,我这里说的是类级别,而没有说是第一种方式,虽然它们是等价的。那么这个类级别是针对什么而言呢?显然,说它是类级别,因为它有@BeforeClass和@AfterClass标签,而这个标签是JUnit的,也就是说只有JUnit在运行该类的时候才会认为它是类级别的,从而只执行一次数据准备与恢复。而这个标签对于我们人而言是无效的,所以我的解决方法就出来了,其实很简单,那就是在有对场景数据进行写操作的测试方法最后手动去调用一次@AfterClass和@BeforeClass所标注的方法。请注意这里的顺序是先调用@AfterClass标准的方法删除被污染的场景数据,再调用@BeforeClass所标注的方法重新加载一遍场景数据。我把这种方式命名为“谁污染,谁治理”。^_^
根据我的实际应用效果来看,这种方法还是很有效的,特别是当一个测试类中有很多测试方法,而这些测试方法所用到的场景数据基本上都一样且会造成场景数据污染的测试方法数所占比例不大的时候尤其好使,大家可以试试。
讲到最后,不知道大家有没有注意到一个细节,用@BeforeClass、@AfterClass和@Before、@After所标注的方法有一个小小的差别。那就是Junit4规定用@BeforeClass、@AfterClass所标注的方法必须是静态的,而用@Before、@After所标注的方法不能是静态的。静态的方法在类中是可以不通过对象直接调用的,我在想,JUnit这样的设计是否就是为了方便我们在测试方法中手动调用@BeforeClass和@AfterClass所标注的方法呢?
分享到:
相关推荐
1. **为准备使用参数化测试的测试类指定特殊的运行器** `org.junit.runners.Parameterized`。 2. **为测试类声明几个变量**,分别用于存放期望值和测试所用数据。 3. **为测试类声明一个带有参数的公共构造函数**,...
在软件开发过程中,测试是确保产品质量的...它们的结合使用,能够覆盖从代码质量验证到系统整体性能评估的全方位测试需求。在实际工作中,了解和熟练掌握这些工具,对于提升测试效率,保证软件质量有着极其重要的意义。
7. **测试脚本**:自动化测试中使用的代码片段。 测试用例分为正面测试用例和负面测试用例。正面测试用例验证正常情况下的功能,而负面测试用例则检查系统在异常或边界条件下的表现。例如,如果一个功能要求输入...
总结起来,Ant和JUnit的结合使用使得Java开发人员能够轻松地管理和执行单元测试,确保代码的质量和稳定性。通过Ant脚本,你可以集成整个测试过程到持续集成/持续部署(CI/CD)流程中,提升开发效率并减少错误。在提供...
5. **JUnit插件**:feed4junit用于参数化JUnit测试脚本。 6. **Hudson**:持续集成工具,用于自动化构建和测试。 7. **SVN**:版本控制系统,管理代码。 **环境搭建步骤** 1. **JDK和ANT**:安装JDK,配置环境变量...
单元测试是确保软件质量的重要手段之一,JUnit和Selenium作为业界广泛使用的工具,在提升测试效率和准确性方面发挥着关键作用。通过本文的介绍,希望读者能更好地理解这两种工具的特点及其在单元测试中的应用场景。...
在Java环境中,我们通常会使用JUnit、TestNG这样的框架进行单元测试,而对于更复杂的场景,比如Web应用的端到端测试,Selenium等工具则更为适用。 在自动化测试脚本的创建过程中,我们需要关注以下几个关键点: 1....
4. 数据驱动测试:利用外部数据源控制测试执行,实现多样化的测试场景。 5. 参数化测试:TestNG的一种特性,用于实现数据驱动测试。 6. 测试用例设计:编写具体的自动化测试脚本,每个脚本对应一个或多个测试场景。 ...
对于需要初始化数据的测试,可以使用`@Sql`和`@SqlGroup`注解来执行SQL脚本,或者使用`@DataJpaTest`的`@Import`导入包含`@TestDataSource`的配置。 七、测试覆盖率报告 为了了解测试的覆盖率,我们可以使用JaCoCo...
自动化测试是指利用特定的软件工具执行预先定义的测试脚本,以替代或辅助手动测试的过程。它主要用于回归测试、性能测试、功能测试等场景,以实现快速、可重复和可靠的测试结果。 二、选择自动化测试工具 在自动化...
通过参与这样的大赛,学生们不仅能学习到如何编写有效的测试脚本,还能了解到如何使用自动化测试工具,比如Appium、JUnit、 Espresso等,以及如何编写测试报告和缺陷管理。同时,他们也将接触到敏捷开发和持续集成/...
4. 生成报告:所有测试执行完毕后,调用工具的相应方法生成JUnit格式的XML报告。 在实际项目中,为了提高自动化程度,通常会将报告生成步骤与构建过程结合起来,例如在Gradle构建脚本中添加相应的任务。此外,还...
JUnit是Java领域广泛使用的单元测试框架,它允许开发者编写可重复执行的测试用例,确保代码的正确性和稳定性。通过JBoss encore的测试自动生成工具,开发者可以快速创建JUnit测试类,减少了手动编写测试代码的工作量...
本文将深入探讨标题为"行业分类-物理装置-一种提高自动化测试执行效率的方法及系统"的相关知识点,这主要涉及到如何通过创新技术和策略优化自动化测试流程,以提升测试效率。 首先,我们要理解自动化测试的基本概念...
7.1 软件测试自动化基础:自动化测试是指使用自动化工具进行测试活动的管理与实施,包括测试脚本的开发和执行,目的是覆盖更多测试场景,尤其是那些手动测试难以实现的复杂情况,如性能、压力和配置测试。自动化测试...
在这个场景中,"自动化测试"指的是使用预先编写的测试脚本来自动执行SPECjbb2005测试,这通常涉及到脚本编写(如使用Java、Python或Shell脚本),测试框架的集成(如JUnit或TestNG),以及测试结果的收集和分析。...
5. **测试套件和分类**:使用JUnit的注解如`@Test`、`@Before`、`@After`来定义测试前的准备工作、测试执行和测试后的清理工作。可以将相关的测试用例组织成测试套件,方便批量运行。 6. **Maven构建**:通过Maven...
在与谷歌浏览器结合时,它提供了一个名为"BlazeMeter Chrome Recorder"的插件,这使得用户可以方便地记录前端交互行为,转化为可执行的测试脚本。 在前端测试领域,BlazeMeter Chrome Recorder扮演了关键角色。它...
自动化测试的定义强调了使用自动化工具验证软件测试需求的过程,包括测试活动的管理和脚本执行。看待自动化测试,应该认识到它是手动测试的补充,而非替代。它适用于系统功能逻辑测试、验收测试、适应性测试、界面...