JUnit4通过大量引入Annotation,让我们的测试变得更加简单和高效。通过学习深入探索Junit4
的例子,进行了一些小小实践:
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
/**
* @Before:初始化方法
* @After:释放资源
* @Test:测试方法,在这里可以测试期望异常和超时时间
* @Ignore:忽略的测试方法
* @BeforeClass:针对所有测试,只执行一次,且必须为static void
* @AfterClass:针对所有测试,只执行一次,且必须为static void
* 一个JUnit 4 的单元测试用例执行顺序为:
* @BeforeClass –> @Before –> @Test –> @After –> @AfterClass
* 每一个测试方法的调用顺序为:
* @Before –> @Test –> @After
*
* @author samueli
*
*/
public class CaculatorTest {
private Caculator c = null;
private static int SUM;
@BeforeClass //设置全局静态变量,只调用一次
public static void setVar(){
for(int i = 1; i <= 10000; i++){
SUM += i;
}
}
@Before //初始化方法,每个测试方法前都会调用一次
public void init(){
c = new Caculator();
}
@After //销毁方法,每个测试方法后都会调用一次
public void destory(){
c = null;
System.gc();
}
@Test
public void sum() {
int a = 10;
int b = -10;
assertEquals(0, c.sum(a, b));
}
@Test
public void divide() {
int a = 0;
int b = -1;
assertEquals(0, c.divide(a, b));
}
@Test(expected=ArithmeticException.class) //除0抛出异常
public void exceptionDivide() {
int a = 10;
int b = 0;
c.divide(a, b);
}
@Test(timeout=1000) //耗时超过1秒测试失败
public void batchSum(){
int start = 1;
int end = 10000;
assertEquals(SUM, c.batchSum(start, end));
}
@Ignore("this test isn't working yet")
@Test
public void temp(){
int sum = 0;
for(int i = 1; i <= 10000; i++){
sum += i;
}
System.out.println(sum);
}
@AfterClass //清理全局静态变量,只调用一次
public static void clearVar(){
SUM = 0;
}
}
上面的例子完整的演示了JUnit4引入的BeforeClass,Before,Test, Ignore, After,AfterClass等注解,注释部分说明了他们的执行顺序。
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* 参数化测试
* @author samueli
*
*/
@RunWith(Parameterized.class)
public class ParametricTest {
private static String zipRegEx = "^\\d{5}([\\-]\\d{4})?$";
private static Pattern pattern;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
pattern = Pattern.compile(zipRegEx);
}
// 声明两个类成员
private String phrase;
private int match;
// 匹配值的构造函数
public ParametricTest(String phrase, int match) {
this.phrase = phrase;
this.match = match;
}
/**
* 一个通用测试
* @throws Exception
*/
@Test
public void verifyGoodZipCode() throws Exception {
Matcher mtcher = pattern.matcher(phrase);
boolean isValid = mtcher.matches();
int validFlag = isValid ? 1 : 0;
assertEquals("Pattern did not validate zip code", validFlag, match);
}
/**
* 含@Parameters 注释的 feeder 方法:
* 必须声明为 static 并返回一个 Collection 类型
* @return
*/
@SuppressWarnings("unchecked")
@Parameters
public static Collection getValues() {
return Arrays.asList(new Object[][] { { "22101", 1 }, { "221x1", 0 },
{ "22101-5150", 1 }, { "221015150", 0 } });
}
}
这个参数话的例子来自原文,文中描述参数话测试的步骤摘录如下:
DW 写道
1. 创建一个不含参数的通用测试。
2. 创建一个返回 Collection 类型的 static feeder 方法,并用 @Parameter 注释加以修饰。
3. 为在步骤 1 中定义的通用方法所要求的参数类型创建类成员。
4. 创建一个持有这些参数类型的构造函数,并把这些参数类型和步骤 3 中定义的类成员相应地联系起来。
5. 通过 @RunWith 注释,指定测试用例和 Parameterized 类一起运行。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
* 测试套件
* @author samueli
*
*/
@RunWith(Suite.class)
@SuiteClasses( { CaculatorTest.class, ParametricTest.class })
public class SuiteTest {
}
最后是我们的测试套件,指定了两个测试类。
后面附上源代码。
分享到:
相关推荐
【标题】:“Easyb初体验” 在IT行业中,我们经常需要进行各种自动化测试,以确保软件的质量和稳定性。Easyb就是这样一款工具,它为Java应用程序提供了简洁、易读的BDD(行为驱动开发)风格的测试框架。这篇博客将...
这篇博客文章“URLClassLoader初体验”可能深入探讨了如何使用`URLClassLoader`来动态加载类和资源,以及它在实际开发中的应用。下面我们将详细探讨`URLClassLoader`的相关知识点。 首先,`URLClassLoader`是Java...
IntelliJ IDEA是一款由JetBrains公司开发的...总之,IntelliJ IDEA 2024.1.4 Windows版将带来一系列改进和新功能,旨在提升开发者的效率和舒适度,无论你是经验丰富的开发者还是初入编程的新手,这个版本都值得尝试。
本篇文章将围绕"安卓开发-weibo4andriod-2011-01-14.zip.zip"这一主题,深入探讨Weibo4Android项目在2011年初的开发细节,旨在帮助读者理解安卓平台上的微博应用开发,以及当时的开发环境和技术趋势。 Weibo4...
对 Hibernate 初体验 1.新建一个java工程,工程名为Hiberante1 2.导入相应的jar包 1)hibernate需要导入这些包 2)因为我们需要操作数据库所以要导入数据库的包,我用的mysql数据库 3.创建数据库以及表 ...
在"Dagger2 初体验.md"这个文件中,我们可能会找到以下关键概念和步骤: 1. **组件(Component)**:组件是Dagger2的核心,它定义了依赖关系的接口。通过`@Component`注解,我们可以声明所需的模块(Module)以及...
达内科技的测试基础笔记为初入行业的测试人员提供了丰富的学习资源,旨在帮助他们掌握基本的测试理论和实践技能。下面我们将深入探讨一些核心的测试知识点。 一、测试目标与原则 1. 测试的目标是为了发现软件中的...
Log4j用于日志记录,JUnit用于单元测试,JFreeChart则是用于生成图表的库,这些工具对于提升软件开发的效率和软件质量至关重要。 为了进一步增强实战性,本书还介绍了如何将这些技术整合起来,并通过不同的项目案例...
对于初入编程领域的人士来说,这是一个理想的参考资料,可以从中学习到如何构建一个功能完备的相册管理系统。 【描述】:这个相册系统包含了从数据存储、图像处理到用户交互等多个方面的编程知识。通过分析和理解...
在信息技术领域,软件测试是一项至关重要的环节,它确保了产品的质量和用户体验。这个“软件测试教程”旨在为初学者提供一个全面的入门平台,并帮助有经验的测试人员进一步提升技能。本文将深入探讨软件测试的基础...
然而,真正推动Ajax发展的是2000年代初Google Maps的发布,它利用JavaScript与服务器进行异步通信,实现了平滑的滚动和缩放效果,从而展示了Ajax的潜力。 **2. XMLHttpRequest对象** XMLHttpRequest对象是Ajax的...
随着业务的发展,系统面临的负载会逐渐增加,因此,设计之初就需要考虑系统的可扩展性,确保在负载增加时,系统能够平滑地扩展资源,保持稳定的服务质量。这涉及到微服务架构、负载均衡、缓存策略等一系列技术的应用...
例如,使用Log4j进行日志记录,JUnit进行单元测试,以及使用Git进行版本控制和团队协作。 总的来说,【Java精品项目第41期毕业设计管理系统】是一个全面的实践项目,它涵盖了Java Web开发的多个重要方面,包括后端...
软件评测师是软件开发过程中的关键参与者,他们通过系统化的方法对软件进行测试,发现并报告问题,以提高软件的可靠性和用户体验。他们的主要职责包括制定测试计划,设计测试用例,执行测试,记录并分析结果,以及...
4. **单元测试**:利用JUnit和Mockito等工具,编写单元测试,保证代码质量。 5. **自动化构建**:集成Maven或Gradle,实现项目的自动化构建、部署和测试。 总结来说,通过对Struts 1的性能优化、安全加固以及现代...