搞定Junit单元测试{非专业}
1:测试分类
- 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
- 2. 白盒测试:需要写代码的。关注程序具体的执行流程。
2:常用测试方法
Junit 组合测试注解:
- RunWith 指定测试类的为指定容器 可以为 Category SuitCase
- Parametered 建立参数类 且必须提供一个内部的静态方法 返回一个集合的Collection<Object[]>
- Runwith 必须是Parameterized.class
- Category 将测试方法 分类
- RunWith 必须指定为Categories.class
- FixMethodOrder 定义测试次序
2.1 断言语句
Assert类 以静态方法 提供了一系列的测试方法
Method |
Description |
assertNull(java.lang.Object object) |
检查对象是否为空 |
assertNotNull(java.lang.Object object) |
检查对象是否不为空 |
assertEquals(long expected, long actual) |
检查long类型的值是否相等 |
assertEquals(double expected, double actual, double delta) |
检查指定精度的double值是否相等 |
assertFalse(boolean condition) |
检查条件是否为假 |
assertTrue(boolean condition) |
检查条件是否为真 |
assertSame(java.lang.Object expected, java.lang.Object actual) |
检查两个对象引用是否引用同一对象(即对象是否相等) |
assertNotSame(java.lang.Object unexpected, java.lang.Object actual) |
检查两个对象引用是否不引用统一对象(即对象不等) |
Fail() |
直接返回一个测试失败的方法 |
3: 基本测试
public class Usually_Test {
private int a;
private int b;
@BeforeClass
public static void start() {
System.out.println("start--------");
}
@Before
public void before() {
this.a=;
this.b=;
}
@Test
public void testAdd() {
int res=add(a, b);
assertEquals(, res);
}
@Ignore
public void testAdd2() {
int res=add(a, b);
assertEquals(, res);
System.out.println("testAdd2方法被忽略");
}
public static int add(int a,int b) {
return a+b;
}
@After
public void after() {
this.a=;
this.b=;
}
@AfterClass
public static void end() {
System.out.println("end-----------");
}
}
4: 组合测试
@RunWith(Suite.class) //标示为组合测试
@SuiteClasses({A.class,B.class}) // 被测试的类必须为public类
public class ALLTest {
// all test
}
public class A{
@Test
public void test_m() { }
}
public class B{
@Test
public void test_m() { }
}
5:参数化测试
必须提供@Parameter方法,方法的返回必须是public static Collection,不能有参数,
并且collection元素必须是相同长度的数组。同时数组的长度必须与测试类的字段(m1,m2,result)的数量相匹配
- 参数字段必须是public
@RunWith(Parameterized.class) // 必须指定为Parameterized.class
public class ParameterizedTestFields {
@Parameterized.Parameter()
public int a;
@Parameterized.Parameter()
public int b;
@Parameterized.Parameter()
public int result;
// public int a;
// public int b;
// public int result;
// // 可以使用构造方法代替
// public ParameterizedTestFields(int a, int b, int result) {
// super();
// this.a = a;
// this.b = b;
// this.result = result;
// }
// creates the test data
@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { , , }, { , , }, { , , } };
return Arrays.asList(data);
}
@Test
public void testMultiplyException() {
Usually_Test test = new Usually_Test();
Assert.assertEquals("Result", result, test.mul(a, b));
}
}
参数不匹配将会抛出java.lang.IllegalArgumentException: wrong number of arguments
6:分类测试(Category)
- @Category 可以作用于类上,方法上
- 聚合测试属性
- @Categories.ExcludeCategory 要排除测试的那些类
- @Categories.IncludeCategory 要测试包含测试的那些类
// 两个标记接口
interface FastTests { }
interface SlowTests { }
// 主测试类
@RunWith(Categories.class)
@Categories.IncludeCategory({FastTests.class})
@SuiteClasses({A.class,B.class})
public class TestAndCategory {
/**
* A: 这里A类的 test_m1 被FastTests标注 test_m2 被SlowTests接口标注
* B: 这里B类被 SlowTests FastTests两个接口标准
*/
@Test
public void test() {
}
}
// 两个测试类
public class A{
@Test
@Category(FastTests.class)
public void test_m1() {
System.out.println("A类的 test_m1 FastTests 被执行");
}
@Test
@Category(SlowTests.class)
public void test_m2() {
System.out.println("A类的 test_m2 SlowTests 被执行");
}
}
@Category({FastTests.class,SlowTests.class}) // 类中的方法都会被标注
public class B{
@Test
public void test_m() {
Assert.assertTrue(System.getProperty("os.name").contains("Windows"));
} @Test
public void test_m2() {
System.out.println("B类的 test_m2 SlowTests");
}
}
7:Rule测试
Junit中的规则 即实现了TestRule接口,已久为我们实现了以下一些内容
规定 实现了TestRule接口的类构建实例必须用以下注解标准
- @Rule @Rule是方法级别的,每个测试方法执行时都会调用被注解的Rule
- @RuleClass 在执行一个测试类的时候只会调用一次被注解的Rule。
- 要求 @Rule @RuleClass 必须是Public的字段
ExpectedException 抛出异常例子
public class User_RuleTest {
@Rule
public ExpectedException exception=ExpectedException.none();
/**
* 1:必须抛出ArrayIndexOutOfBoundsException
* 2:异常消息为1
*/
@Test
public void test_ExpectedException() {
exception.expect(ArrayIndexOutOfBoundsException.class);
exception.expectMessage("");
ThrowExceptionClass t = new ThrowExceptionClass();
t.methodToBeTest();
}
}
class ThrowExceptionClass{ public void methodToBeTest(int i) {
if (i == ) {
throw new ArrayIndexOutOfBoundsException("");
}
}
}
TemporaryFolder 创建零时文件例子(自动删除)
public class Use_Rule_Test2 {
@Rule
public TemporaryFolder tFolder=new TemporaryFolder(); @Test
public void tets_CreateTempFiles() throws IOException {
File createdFolder = tFolder.newFolder("newfolder");
File createdFile = tFolder.newFile("myfilefile.txt");
Assert.assertTrue(createdFile.exists());
Assert.assertTrue(createdFolder.exists());
} }
8: 常见异常
java.lang.Exception: No tests found matching: 导入hamcrest-all 1.3版本 我是junit 4.12
java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test_ExpectedException], {ExactMatcher:fDisplayName=test_ExpectedException(Junit_case.User_RuleTest)], {LeadingIdentifierMatcher:fClassName=Junit_case.User_RuleTest,fLeadingIdentifier=test_ExpectedException]] from org.junit.internal.requests.ClassRequest@60215eee
at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:40)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createFilteredTest(JUnit4TestLoader.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:74)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
org.junit.internal.runners.rules.ValidationError: The @Rule 'exception' must be public. 字段要求为Public
at org.junit.internal.runners.rules.RuleMemberValidator$MemberMustBePublic.validate(RuleMemberValidator.java:222)
at org.junit.internal.runners.rules.RuleMemberValidator.validateMember(RuleMemberValidator.java:99)
at org.junit.internal.runners.rules.RuleMemberValidator.validate(RuleMemberValidator.java:93)
at org.junit.runners.BlockJUnit4ClassRunner.validateFields(BlockJUnit4ClassRunner.java:196)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:129)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
搞定Junit单元测试{非专业}的更多相关文章
- 一文搞定Spring Boot + Vue 项目在Linux Mysql环境的部署(强烈建议收藏)
本文介绍Spring Boot.Vue .Vue Element编写的项目,在Linux下的部署,系统采用Mysql数据库.按照本文进行项目部署,不迷路. 1. 前言 典型的软件开发,经过" ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 教你怎么半天搞定Docker
首先,不要把docker想的那么高大,它不就是先做个镜像,然后通过docker像虚拟机一样跑起来嘛...docker其实在真实业务场景中还是非常有局限性的.Dockerfile脚本也没那么好写,有些应 ...
- 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……
大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...
- 如何让两个div在同一行显示?一个float搞定
最近在学习div和css,遇到了一些问题也解决了很多以前以为很难搞定的问题.比如:如何让两个div显示在同一行呢?(不是用table表格,table对SE不太友好)其实,<div> 是一个 ...
- 3小时搞定一个简单的MIS系统案例Northwind,有视频、有源代码下载、有真相
一.瞎扯框架.架构 楼主自从1998年从C语言.MASM.Foxbase开始学计算机开始接触这个行当16年以来,2001年干第一份与程序.软件.然后是各种屌的东西开始,差不多干了13年了,这13年来, ...
随机推荐
- Dockerfile优化
总结: 1.编写.dockerignore文件 2.容器只运行单个应用 3.将多个RUN指令合并为一个 4.基础镜像的标签不要用latest 5.每个RUN指令后删除多余文件 6.选择合适的基础镜像( ...
- appium---模拟点击事件
在做自动化的过程中都会遇到一些无法定位到的地方,或者通过元素怎么都定位不成功的地方,这个时候我们可以使用必杀技,通过坐标定位.具体的怎么操作呢? swipe点击事件 前面安静写过一篇关于swipe的滑 ...
- 【使用篇二】Quartz自动化配置集成(17)
出处:https://www.jianshu.com/p/49133c107143 定时任务在企业项目比较常用到,几乎所有的项目都会牵扯该功能模块,定时任务一般会处理指定时间点执行某一些业务逻辑.间隔 ...
- 安装Linux操作系统,学习Linux基础
第一项:安装Linux系统 遇到的问题: 1.操作过程中遇到权限不足的情况. 解决过程:通过百度后发现可以使用sudo,或chmod命令解决. 2.在以上过程中对chmod命令的用法产生疑惑. 解决过 ...
- ReactNative: 使用像素密度类PixelRatio进行适配
一.简介 现在设备显示屏的清晰度越来越高,尤其是iOS移动设备上的高清适配,Retina显示屏.在开发中,为了保证图片在不同的设备上显示的效果保持一致,往往需要准备多套图片,比如iOS开发中的@1x, ...
- md2all 简单实用
. 简单使用 md2all 使用地址:http://md.aclickall.com/ . 常用操作 #代表标题等级 英文下```java(语言)``` 代表代码块
- .NET Application,Session,Cookie,ViewState,Cache对象用法
作用域 保存地址 生命周期Application 应用程序 服务器内存 IIS启动Session 整个站点 服务器内存 Session到时 默认20分钟Cashe 应用程序 服务器内存 应用程序的周期 ...
- .Netcore Swagger - 解决外部库导致的“Actions require an explicit HttpMethod binding for Swagger 2.0”
现象: 项目中导入Ocelot后,swagger页面无法正常显示,查看异常发现 Ocelot.Raft.RaftController 中的 Action 配置不完全,swagger扫描时不能正确生成 ...
- springboot之jpa支持
相关pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- attempted to return null from a method with a primitive return type (int).
java接口文件 package com.cyb.ms.mapper; import org.apache.ibatis.annotations.Param; public interface Acc ...