I amQiana , WELCOME.

NO TRY , NO HIGH

单元测试基本概念

什么是单元测试?

Unit testing is when you write test code to verify
单元测试就是在编程时用测试代码来验证代码中的各个单元

如何正确书写测试?

1.AAA逻辑顺序 arrange act assert [after(close something)]

@Test
public void testSay() {

    // Arrange
    HelloWorld helloWorld = new HelloWorld();

    // Act
    String result = helloWorld.say();

    // Assert
    assertEquals("Hello World!", result);
}

// After (optional)

@After
public void tearDown() {
    // Close something...
}

2.Given When Then描述结构 (given someContext when DoingSomeBehavior Then SomeResultOccurs)
3.some_result_occurs_when_doing….
4.测试即文档
5.Suite-Fixture-Case
6.无限接近言简意赅的自然化语言
7.Matcher神器-Hamcrest
8.Mock神器-Mockito (stub vs mock)
9.异常处理和测试神器-Fishbowl

注意:

1.测试行为而不是测试方法-测试的是一个类的全部行为的集合,而不是他的每一个独立的方法。—-TDD
2.测试与生产的关系——寻求更好的代码设计技巧
3.专注和单一的价值–单元测试用例分解清晰
4.保持测试的相关性—junit : Category & Ignoring a Test
5.写断言时慎用不靠谱的语气目标 (正则表达式作为断言 or 调用其他方法返回值作为断言)

什么是好的测试?

fast-好的测试足够快,测试易于编写,减少依赖
Isolated-好的测试应该相互隔离,不依赖于别的测试,不依赖于外部资源,单一职责原则
Repeatable-好的测试可复验,排除产生不确定性干扰,使用模拟对象和单一工具java8 新增class
Self-validation-自确认,自排序,及时,自动化运行,快速准确确认结果,最细粒度,最快速
Timely-足够及时

测试什么?

Right-BICEP原则
Right-结果正确,Happy-Path测试,了解最终用户的目标,或所面对代码的行为
Boundary Conditions-边界条件正确,bug往往发生在边界上,CORRECT原则
Inverse Relationships-检查反向关系,尽量避免调用与正向相同方法
Cross-Check能否用其他手段对结果进行再次确认,
Error-Conditions-强制触发错误条件,unhappy-path (Fishbowl and Mock)
Performance–性能测试是否在允许范围内

如何确定边界条件?

conformance (一致性)-- 值 是否和预期的一致。
Ordering(顺序性)--一组值是该有序或者无序的。
Range(区间性)--值是否位于合理的最小值和最大值之内。
Reference(引用 、耦合性)--代码是否引用了一些不在代码本身控制范围之内的外部资源。
Existence(存在性)--值是否存在(例如,是否是非null,非0,在一个集合中等等)。
Cardinatity(基数性)--是否恰好有足够的值?
Time(相对或者绝对的时间性)--所有事情的发生是否是有序的?是否是在正确的时刻?是否恰好及时?