文章目录
知识点
软件测试
- 软件测试的经典定义是:
在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
- 软件测试分类
- 单元 vs 集成测试
- 白盒 vs 黑盒测试
- 自动 vs 手动测试
- 回归测试
- 压力测试
- 。。。。。
单元和集成测试
- 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。通常是一个函数/方法。
- 单元测试是已知代码结构进行的测试,属于白盒测试。
- 集成测试是将多个单元相互作用,形成一个整体,对整体协调性进行测试。
- 一般从构成系统的最小单元开始,持续推进到单元之间的接口直到集成为一个完成的软件系统为止。
白盒和黑盒测试
- 白盒测试 (white-box testing),全面了解程序内部逻辑结构,对所有的逻辑路径都进行测试。一般由程序员完成。
- 黑盒测试 (black-box testing),又名功能测试,将程序视为一个不能打开的黑盒子。在完全不考虑程序内部结构和内部特性的情况下,检查程序功能是否按照需求规格说明书的规定正常使用。一般由独立的使用者完成。
自动和手动测试
- 自动测试 :用测试程序批量、反复测试功能程序,并可自动检查功能程序输出结果是否满足预定的要求。
- 手动测试:手动执行程序,手动输入所需要的参数,手动检查程序结果是否满足预定的要求。
回归测试
- 回归测试 :修改旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
- 回归测试在整个软件测试过程中占有很大的比重。软件快速迭代开发过程中,新版本的连续发布(Daily/Nightly Build)使得回归测试进行的更加频繁。
测试策略
- 基于main函数的策略
- 优点:简单
- 缺点:
- 无法自动判断被测对象的行为是否符合预期
- main方法需要添加大量的代码,这些代码在发布时候也需要手动删除
- 分散程序员在开发时的关注点
- 基于自动化测试框架的策略
- 初始化 ⇒ \Rightarrow ⇒输入测试数据执行被测代码 ⇒ \Rightarrow ⇒获取系统实际结果 ⇒ \Rightarrow ⇒比较结果是否一致 ⇒ \Rightarrow ⇒输出测试结论
JUnit
简介
JUnit:一个Java语言的单元测试框架
- Kent Beck (极限编程) 和 Erich Gamma (设计模式)建立的
- 是xUnit家族中最成功的一个
x代表的是某一个语言的首字母,类似有NUnit等
- 大部分的Java IDE都集成了JUnit作为单元测试工具
- 官网: https://junit.org
- 版本
- 5 :最后稳定版5.3.2, 2018.11发布
- 4 :最后稳定版4.12, 2014.12发布
- 3 :最后稳定版3.8.2, 2007.5发布
问题分析和测试用例
给定三个整数,判断以此为边长能否构成三角形
- 三个整数都要大于0 (-1, 2, 3) (3, 2, 0)
- 任意两边之和大于第三边 (1,2,3) (2, 3, 6)
- a+b>c
- b+c>a
- c+a>b
pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>MOOC14-02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
三角形边长代码
public class Triangle {
public boolean judgeEdges(int a, int b, int c)
{
boolean result = true;
//边长非负性
if(a<=0 || b<=0 || c<=0) {
return false;
}
//两边和大于第三边
if(a+b<=c) {
result = false;
}
if(b+c<=a) {
result = false;
}
if(c+a<=b) {
result = false;
}
return result;
}
}
三角形边长测试类代码
import static org.junit.Assert.*; //导入Assert类的所有静态方法,自JDK1.5引入
import org.junit.Assert;
import org.junit.Test;
public class TriangleTest {
@Test //注解
public void test() {
assertEquals(true, new Triangle().judgeEdges(1,2,3));
//Assert.assertEquals(false, new Triangle().judgeEdges(1,2,3));
}
}
- 每一个测试方法的头部加 @Test (注解),这样JUnit会自动执行这些测试方法。
- import static:导入某一个类的所有静态方法。
-
a
s
s
e
r
t
E
q
u
a
l
s
assertEquals
assertEquals:最常用的断言方法,在
Assertions
类中定义。判定第二个参数的函数输出是否符合第一个参数的预期值,不符合则报异常。
断言方法
- assertEquals(expected, actual):查看两个对象是否相等。类似于字符串比较使用的equals()方法;
- assertNotEquals(first, second):查看两个对象是否不相等。
- assertNull(object):查看对象是否为空。
- assertNotNull(object):查看对象是否不为空
- assertSame(expected, actual):查看两个对象的引用是否相等,类似于使用“==”比较两个对象;
- assertNotSame(unexpected, actual):查看两个对象的引用是否不相等,类似于使用“!=”比较两个对象。
- assertTrue(String message, boolean condition) 要求condition == true,查看运行的结果是否为true;
- assertFalse(String message, boolean condition) 要求condition == false,查看运行的结果是否为false。
- assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual),即查看两个数组是否相等。
- assertThat(String reason, T actual, Matcher matcher) :要求matcher.matches(actual) == true,使用Matcher做自定义的校验。
JUnit执行结果
- 执行方法
右键测试类 ⇒ \Rightarrow ⇒run as ⇒ \Rightarrow ⇒Maven Test
- 正确范例
assertEquals(false, new Triangle().judgeEdges(1,2,3));
- 错误范例
assertEquals(true, new Triangle().judgeEdges(1,2,3));
Maven执行结果
- 执行方法
右键项目 ⇒ \Rightarrow ⇒run as ⇒ \Rightarrow ⇒Maven Test
- 正确范例
assertEquals(false, new Triangle().judgeEdges(1,2,3));
- 错误范例
assertEquals(true, new Triangle().judgeEdges(1,2,3));
练习
编写一个DateUtil的类,里面有一个isLeapYear(int year) 的方法,判断输入年份是否是闰年。如果是闰年,返回true,其他返回false。闰年需要满足以下3个条件:
- 年份必须大于0,且小于等于10000。
- 年份不能整除100,且可以整除4。
- 年份可以整除100,且可以整除400。
请编写JUnit测试类DateUtilTest,采用以下用例,使用assertEquals来测试程序正确性。-100, 1000, 20000, 2020, 2019, 2000, 1900.
// pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>MOOC14-02Maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
// DateUtil.java
public class DateUtil {
public boolean isLeapYear(int year) {
boolean result = false;
if(year<=0||year>10000)
return false;
if(year%100==0) {
if(year%400==0)
result=true;
}
else
if(year%4==0)
result=true;
return result;
}
}
// YearTest.java
import static org.junit.Assert.*; //导入Assert类的所有静态方法,自JDK1.5引入
import org.junit.Assert;
import org.junit.Test;
public class YearTest {
@Test
public void test1() {
assertEquals(false, new DateUtil().isLeapYear(-100));
}
@Test
public void test2() {
assertEquals(false, new DateUtil().isLeapYear(1000));
}
@Test
public void test3() {
assertEquals(false, new DateUtil().isLeapYear(20000));
}
@Test
public void test4() {
assertEquals(true, new DateUtil().isLeapYear(2020));
}
@Test
public void test5() {
assertEquals(false, new DateUtil().isLeapYear(2019));
}
@Test
public void test6() {
assertEquals(true, new DateUtil().isLeapYear(2000));
}
@Test
public void test7() {
assertEquals(false, new DateUtil().isLeapYear(1900));
}
}