转载请标明出处:https://blog.csdn.net/u013254166/article/details/80612127
本文出自: 【rhino博客】
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
为什么要做单元测试?
- 更早发现问题
- 更容易集成
- 更安全的代码修改
单元测试的原则与模式
- 把测试当做文档(针对Api)
- 所有单元测试都是自检查的
- 不要单独为测试创建特别的逻辑
- 尽可能保证单元测试的简单性
二、APP目录介绍
src/test: 运行在本地电脑Java虚拟机上的单元测试,适合做一些java接口的测试;
src/androidTest: 运行在手机或者模拟器上,适合做一些ui测试或者逻辑测试。
三、配置
我们需要在app目录gradle中添加依赖,java测试添加下面依赖即可,Android测试要复杂一些,下篇文章Android Studio中的单元测试(二)Android测试会详细讲解。
dependencies { ... testImplementation 'junit:junit:4.12' }
四、Annotation
Annotation | 描述 |
@Test public void method() | 定义所在方法为单元测试方法 |
@Test (expected = Exception.class) | 如果所在方法没有抛出Annotation中的Exception.class->失败 |
@Test(timeout=100) | 如果方法耗时超过100毫秒->失败 |
@Test(expected=Exception.class) | 如果方法抛了Exception.class类型的异常->通过 |
@Before public void method() | 这个方法在每个测试之前执行,用于准备测试环境(如: 初始化类,读输入流等) |
@After public void method() | 这个方法在每个测试之后执行,用于清理测试环境数据 |
@BeforeClass public static void method() | 这个方法在所有测试开始之前执行一次,用于做一些耗时的初始化工作(如: 连接数据库) |
@AfterClass public static void method() | 这个方法在所有测试结束之后执行一次,用于清理数据(如: 断开数据连接) |
@Ignore或者@Ignore("Why disabled") | 忽略当前测试方法,一般用于测试方法还没有准备好,或者太耗时之类的 |
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestClass{} | 使得该测试方法中的所有测试都按照方法中的字母顺序测试 |
@Assume.assumeFalse(boolean condition) | 如果满足condition,就不执行对应方法 |
一个测试类单元测试的执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一个测试方法的调用顺序为:
@Before –> @Test –> @After
五、断言
断言,它的作用是比较实际的值和用户预期的值是否一样,assertEquals在JUnit中有很多不同的实现,下面是一些接口的介绍:
接口 | 说明 |
assertArrayEquals(expecteds, actuals) | 查看两个数组是否相等。 |
assertEquals(expected, actual) | 查看两个对象是否相等。类似于字符串比较使用的equals()方法 |
assertNotEquals(first, second) | 查看两个对象是否不相等。 |
assertNull(object) | 查看对象是否为空。 |
assertNotNull(object) | 查看对象是否不为空。 |
assertSame(expected, actual) | 查看两个对象的引用是否相等。类似于使用“==”比较两个对象 |
assertNotSame(unexpected, actual) | 查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象 |
assertTrue(condition) | 查看运行结果是否为true。 |
assertFalse(condition) | 查看运行结果是否为false。 |
assertThat(actual, matcher) | 查看实际值是否满足指定的条件 |
fail() | 让测试失败 |
六、栗子
首先增加一个计算的工具类Calculator.java,添加了一个求和方法,用于接下来的单元测试。这里只介绍了一个简单的栗子,详细介绍可以参照junit4官网。
public class Calculator { public double sum(double a, double b) { return a + b; } }
现在我们可以鼠标右键空白处,选择Test,选择Create New Test...
这里可以选择需要测试的接口,以及选择是否生成setUp和tearDown方法,setUp会在测试启动的时候被调用,tearDown会在测试结束的时候被调用,点击OK,然后选择src/test目录。
我们将自动生成的CalculatorTest.java稍做修改,如下:
public class CalculatorTest { Calculator calculator; @Before public void setUp() throws Exception { System.out.println("setUp"); calculator = new Calculator(); } @After public void tearDown() throws Exception { System.out.println("tearDown"); } @Test public void sum() { assertEquals(2, calculator.sum(1, 1), 0); } }
现在我们可以开始进行测试了,右键CalculatorTest.java。
点击Run 'CalculatorTest',可以看到如下结果,代表测试通过了。
现在我们修改一下sum方法,如下:
@Test public void sum() { assertEquals(1, calculator.sum(1, 1), 0); }
再次run,结果如下:
显然1+1不等于期望值1,所以报错了,这样就达到我们单元测试的目的。
七、DEMO下载地址
感谢:
https://www.cnblogs.com/myhomepages/p/6014285.html
https://blog.csdn.net/wangpeng047/article/details/9628449