2021-11-11 18:46发布
单元测试
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。
JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,功能非常强大。
指的是单元测试,一般用于这个软件测试这块
指的是单元测试,一般用于这个软件测试这块.JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,功能非常强大。
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。
下面是JUnit一些特性的总结:
1、提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。
2、提供了多种方式来显示测试结果,而且可以扩展。
3、 提供了单元测试批量运行的功能,而且可以和Ant很容易地整合。
4、 对不同性质的被测对象,如Class,JSP,Servlet等,JUnit有不同的测试方法。
JUnit的使用非常简单,共有3步:第一步、编写测试类,使其继承TestCase;第二步、编写测试方法,使用test+×××的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用setUp,tearDown方法。
JUnit主要是用来测试白盒的,比方你写了几个函数想想测试它是否执行正常
JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。
— 提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。
— 提供了多种方式来显示测试结果,而且可以扩展。
— 提供了单元测试批量运行的功能,而且可以和Ant很容易地整合。
— 对不同性质的被测对象,如Class,JSP,Servlet等,JUnit有不同的测试方法。
以前,开发人员写一个方法,如下代码所示:
//******* AddAndSub.java**************
public Class AddAndSub {
public static int add(int m, int n) {
int num = m + n;
return num;
}
public static int sub(int m, int n) {
int num = m - n;
如果要对AddAndSub类的add和sub方法进行测试,通常要在main里编写相应的测试方法,如下代码所示:
//******* MathComputer.java**************
public static void main(String args[]) {
if (add (4, 6) == 10)) {
System.out.println(“Test Ok”);
} else {
System.out.println(“Test Fail”);
if (sub (6, 4) ==2)) {
从上面的测试可以看出,业务代码和测试代码放在一起,对于复杂的业务逻辑,一方面代码量会非常庞大,另一方面测试代码会显得比较凌乱,而JUnit就能改变这样的状况,它提供了更好的方法来进行单元测试。使用JUnit来测试前面代码的示例如下:
//******* TestAddAndSub.java**************
import junit.framework.TestCase;
public Class TestAddAndSub extends TestCase {
public void testadd() {
//断言计算结果与10是否相等
assertEquals(10, AddAndSub.add(4, 6));
public void testsub() {
//断言计算结果与2是否相等
assertEquals(2, AddAndSub.sub(6, 4));
public static void main(String args[]){
junit.textui.TestRunner.run(TestAddAndSub .class); }
这里先不对JUnit的使用方法进行讲解,从上可以看到,测试代码和业务代码分离开,使得代码比较清晰,如果将JUnit放在Eclipse中,测试起来将会更加方便。
为了不使读者在环节配置上浪费太多时间,这里将一步一步地讲解如何下载和配置JUnit。具体步骤如下:
从www.junit.org可以进入到JUnit的首页,JUnit的首页画面如图8.1所示。
本书使用的版本是4.3版本,单击“Junit4.3.zip”即可进入下载JUnit的画面,如图8.2所示。
下载Junit4.3.zip,下载后解压缩即可。
下载Junit4.3.zip完毕,并解压缩到D盘根目录下后,即可开始配置环境变量。用前面介绍的设定系统变量的方法,设定ClassPath,ClassPath=***;D:"junit"junit.jar,如图8.3所示。
图8.1 JUnit的首页画面
图8.2 下载JUnit的画面
查看是否配置好JUnit,在类里添加如下语句:
图8.3 设定系统变量ClassPath
如果编译没有错误,则说明配置成功。
如果要使用JUnit,则测试类都必须继承TestCase。当然目前的最新版JUnit是不需要继承它的,但并不是说TestCase类就没有用了,它仍然是JUnit工作的基础。这里先讲述继承TestCase类的方式,稍后再介绍不继承的方式。
下面是前面使用JUnit进行测试AddAndSub类的代码,这里进行详细的分析:
代码说明:
— 这里继承TestCase,表示该类是一个测试类。
— 然后使用junit.textui.TestRunner.run方法来执行这个测试类。
这里给出TestCase的源代码:
//******* TestCase.java**************
package junit.framework;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public abstract class TestCase extends Assert implements Test {
/**测试案例的名称*/
private String fName;
/**构造函数
*/
public TestCase() {
fName= null;
/**带参数的构造函数
public TestCase(String name) {
fName= name;
/**获取被run执行的测试案例的数量
public int countTestCases() {
return 1;
/**创建一个TestResult
* @see TestResult
protected TestResult createResult() {
return new TestResult();
/**执行run方法,返回TestResult
public TestResult run() {
TestResult result= createResult();
run(result);
return result;
/**执行run方法,参数为TestResult
public void run(TestResult result) {
result.run(this);
/**执行测试方法,包括初始化和销毁方法
* @throws Throwable if any exception is thrown
public void runBare() throws Throwable {
Throwable exception= null;
setUp();
try {
runTest();
} catch (Throwable running) {
exception= running;
finally {
tearDown();
} catch (Throwable tearingDown) {
if (exception == null) exception= tearingDown;
if (exception != null) throw exception;
/**执行测试方法
protected void runTest() throws Throwable {
assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
Method runMethod= null;
//利用反射机制
runMethod= getClass().getMethod(fName, (Class[])null);
} catch (NoSuchMethodException e) {
fail("Method """+fName+""" not found");
if (!Modifier.isPublic(runMethod.getModifiers())) {
fail("Method """+fName+""" should be public");
runMethod.invoke(this);
catch (InvocationTargetException e) {
e.fillInStackTrace();
throw e.getTargetException();
catch (IllegalAccessException e) {
throw e;
/**测试前的初始化方法
protected void setUp() throws Exception {
/**测试后的销毁方法
protected void tearDown() throws Exception {
/**返回测试案例的名称
* @return the name of the TestCase
public String getName() {
return fName;
/**设定测试案例的名称
* @param name the name to set
public void setName(String name) {
— 该类继承了Assert 类,实现了Test接口。
— 可以看出,TestCase类正是通过runBare实现了在测试方法前初始化相关变量和环境,在测试方法后销毁相关变量和环境。
测试方法名要以test+方法名来命名,当然最新版的JUnit支持直接以方法名来命名测试方法。这是通过TestCase类里的runTest方法来实现的,主要利用了Java的反射机制,runTest方法的代码如下:
// 获取要测试的方法
//判断要测试的方法是否为公用方法
//Java的反射机制
//抛出调用异常
JUnit主要有以下断言:
— assertEquals(期望值,实际值),检查两个值是否相等。
— assertEquals(期望对象,实际对象),检查两个对象是否相等,利用对象的equals()方法进行判断。
— assertSame(期望对象,实际对象),检查具有相同内存地址的两个对象是否相等,利用内存地址进行判断,注意和上面assertEquals方法的区别。
— assertNotSame(期望对象,实际对象),检查两个对象是否不相等。
— assertNull(对象1,对象2),检查一个对象是否为空。
— assertNotNull(对象1,对象2),检查一个对象是否不为空。
— assertTrue(布尔条件),检查布尔条件是否为真。
— assertFalse(布尔条件),检查布尔条件是否为假。
这些断言主要定义在JUnit的Assert类里,Assert类的示例代码如下:
//******* Assert.java**************
/**一系列的断言方法
public class Assert {
protected Assert() {
/**断言是否为真,带消息
static public void assertTrue(String message, boolean condition) {
if (!condition)
fail(message);
/**断言是否为真
static public void assertTrue(boolean condition) {
assertTrue(null, condition);
/**断言是否为假,带消息
static public void assertFalse(String message, boolean condition) {
assertTrue(message, !condition);
/**断言是否为假
static public void assertFalse(boolean condition) {
assertFalse(null, condition);
/**断言是否为失败
static public void fail(String message) {
throw new AssertionFailedError(message);
static public void fail() {
fail(null);
/**是否相等的断言,带消息Object
static public void assertEquals(String message, Object expected, Object actual) {
if (expected == null && actual == null)
return;
if (expected != null && expected.equals(actual))
failNotEquals(message, expected, actual);
/**是否相等的断言,Object
static public void assertEquals(Object expected, Object actual) {
assertEquals(null, expected, actual);
/**是否相等的断言,带消息String
static public void assertEquals(String message, String expected, String actual) {
throw new ComparisonFailure(message, expected, actual);
/**是否相等的断言,String
static public void assertEquals(String expected, String actual) {
/**是否相等的断言,带消息double
static public void assertEquals(String message, double expected, double actual, double delta) {
if (Double.compare(expected, actual) == 0)
if (!(Math.abs(expected-actual) <= delta))
failNotEquals(message, new Double(expected), new Double(actual));
/**是否相等的断言,double
static public void assertEquals(double expected, double actual, double delta) {
assertEquals(null, expected, actual, delta);
/**是否相等的断言,带消息float
static public void assertEquals(String message, float expected, float actual, float delta) {
if (Float.compare(expected, actual) == 0)
if (!(Math.abs(expected - actual) <= delta))
failNotEquals(message, new Float(expected), new Float(actual));
/**是否相等的断言, float
static public void assertEquals(float expected, float actual, float delta) {
/**是否相等的断言,带消息long
static public void assertEquals(String message, long expected, long actual) {
assertEquals(message, new Long(expected), new Long(actual));
/**是否相等的断言, long
static public void assertEquals(long expected, long actual) {
/**是否相等的断言,带消息boolean
static public void assertEquals(String message, boolean expected, boolean actual) {
assertEquals(message, Boolean.valueOf(expected), Boolean.valueOf(actual));
/**是否相等的断言,boolean
static public void assertEquals(boolean expected, boolean actual) {
/**是否相等的断言,带消息byte
static public void assertEquals(String message, byte expected, byte actual) {
assertEquals(message, new Byte(expected), new Byte(actual));
/**是否相等的断言, byte
static public void assertEquals(byte expected, byte actual) {
/**是否相等的断言,带消息char
static public void assertEquals(String message, char expected, char actual) {
assertEquals(message, new Character(expected), new Character(actual));
/**是否相等的断言,char
static public void assertEquals(char expected, char actual) {
/**是否相等的断言,带消息short
static public void assertEquals(String message, short expected, short actual) {
assertEquals(message, new Short(expected), new Short(actual));
/**是否相等的断言,short
static public void assertEquals(short expected, short actual) {
/**是否相等的断言,带消息int
static public void assertEquals(String message, int expected, int actual) {
assertEquals(message, new Integer(expected), new Integer(actual));
/**是否相等的断言,int
static public void assertEquals(int expected, int actual) {
/**是否不为null的断言 Object
static public void assertNotNull(Object object) {
assertNotNull(null, object);
/**是否不为null的断言,带消息Object
static public void assertNotNull(String message, Object object) {
assertTrue(message, object != null);
/**是否为null的断言Object
static public void assertNull(Object object) {
assertNull(null, object);
/**是否为null的断言,带消息Object
static public void assertNull(String message, Object object) {
assertTrue(message, object == null);
/**是否相同的断言,带消息*/
static public void assertSame(String message, Object expected, Object actual) {
if (expected == actual)
failNotSame(message, expected, actual);
/**是否相同的断言,Object
static public void assertSame(Object expected, Object actual) {
assertSame(null, expected, actual);
/**是否不相同的断言,带消息
static public void assertNotSame(String message, Object expected, Object actual) {
failSame(message);
/**是否不相同的断言Object
static public void assertNotSame(Object expected, Object actual) {
assertNotSame(null, expected, actual);
/**相同时失败
static public void failSame(String message) {
String formatted= "";
if (message != null)
formatted= message+" ";
fail(formatted+"expected not same");
/**不相同时失败
static public void failNotSame(String message, Object expected, Object actual) {
fail(formatted+"expected same:<"+expected+"> was not:<"+actual+">");
/**不相等时失败
static public void failNotEquals(String message, Object expected, Object actual) {
fail(format(message, expected, actual));
/**格式化消息
public static String format(String message, Object expected, Object actual) {
return formatted+"expected:<"+expected+"> but was:<"+actual+">";
从上述代码中,读者可以研读JUnit中有关断言的实现方式,其实,最终都是使用后面的几个static方法来实现的。
JUnit是一个开源的Java单元测试框架
虽然从事开发行业的女生越来越多,但女生的比例还是远比不上男生。软件测试的男女生比例则基本相当,软件测试要求细心、耐心,大部分女生也是比较适合学的。而且软件测试课程分为手工测试和自动化测试,手工测试分为功能测试、性能测试、接口测试。自动化测试...
需要。很多人当初抱着测试不需要懂代码,才选择了这个行业,这个就要看对自己的职业定位了,是止步于月薪过万就可以了,还是往20k、30k去突破,如果这样的话,是肯定要会接口、会自动化,就必然要涉及到代码。如果真的看不懂代码,实际的测试后期的工作会出现...
在我看来游戏开发挺难的,尤其像手游一类的还有网游,里面有很多的程序代码而且伤神又费力,不过也有女生在这方面做的很好的,如果你感兴趣,非常想学,可以试试
软件测试专业现在很火热,很缺少人才,25岁学软件测试能学会,就业薪资也高,工作也相对轻松
测试类型有:功能测试,性能测试,界面测试。功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用...
这个其实和接口测试的场景密不可分的,比如说:外部接口测试: 必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试: 必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...
这个是会因为公司的架构不同而不同的,并不是固定的,但是一般是会有专门的测试部门,或者叫质量保证部,也有可能是叫别的名字。
移动端测试,包括App兼容性测dao试,7*24小时稳定性测试,功耗性能测试,UI测试,交互测试等,课程主要学习的内容有:1、功能测试主要包括计算机基础、软件测试核心理论、Linux、数据库,学习目标是掌握软件测试核心理论,结合Linux、数据库等可实现移动端、w...
标题 1. 首先要做一个标题党(此标题党非彼标题党)。标题一定要清晰简洁易理解,不应该臃长 2. 尽量前缀要规范,例如模板: [Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找 3. 缺陷的标题一定要描述在什么情况下发生了什么问...
1、 缺陷报告可以记录缺陷2、可以对缺陷进行跟踪管理3、可以对缺陷报告进行分类 总结 统计
1、缺陷编号(Defect ID),提交BUG的顺序。2、缺陷标题(summary),简明扼要的说明一下这个BUG。3、缺陷的发现者(DetectedBy) ,一般是自己。4、发现缺陷的日期(Detected on date),一般是当天。5、缺陷所属的模块(subject), 在测试哪个模块的时候发现的BUG...
缺陷标题好的缺陷标题需要让相关人员一目了然,一般建议的格式是条件+失败。缺陷类型缺陷类型也是根据具体的项目而定的。但一般情况下分为功能、界面、建议。重现步骤重现步骤的编写规则可以参考测试用例中的操作步骤 ,一定要足够详细、说明清楚问题的操作顺...
工具:NoSQLUnitJsTestDriverQTRunnerVenusFluintBuster.JSSQLUnitECUTQTestlibUnitilsgreatestDbUnitAbbotGoogleTest框架:JUnitMoqJSCaptureMockCUnitPyUnitCppUTestCppUnitzCUTcipra
JunitTestNGGoogleTestpytestunittestJmockitJaCoCogcov、lcov、gcovrCoverage.pyEvoSuiteDiffblue Cover
React Hooks测试库( Testing Library)是一个简单而完整的React Hooks测试工具。 React Hooks测试库让用户可以为React钩子创建简单的测试工具,自定义钩子的输入和检索输出,以处理在功能组件体内运行的情况。 使用React Hooks,用户不必为了测试而去担...
1、单元测试注重代码逻辑,接口测试注重业务逻辑;2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多;3、单元测试是白盒测试,接口测试是黑盒测试;4、单元测试关注的是代码的实现和逻辑,测试范围较小,保证实...
最多设置5个标签!
单元测试
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。
JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,功能非常强大。
指的是单元测试,一般用于这个软件测试这块
指的是单元测试,一般用于这个软件测试这块.JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,功能非常强大。
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。
下面是JUnit一些特性的总结:
1、提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。
2、提供了多种方式来显示测试结果,而且可以扩展。
3、 提供了单元测试批量运行的功能,而且可以和Ant很容易地整合。
4、 对不同性质的被测对象,如Class,JSP,Servlet等,JUnit有不同的测试方法。
JUnit的使用非常简单,共有3步:第一步、编写测试类,使其继承TestCase;第二步、编写测试方法,使用test+×××的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用setUp,tearDown方法。
JUnit主要是用来测试白盒的,比方你写了几个函数想想测试它是否执行正常
8.1 JUnit介绍
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。
8.1.1 JUnit简介
JUnit主要用来帮助开发人员进行Java的单元测试,其设计非常小巧,但功能却非常强大。
下面是JUnit一些特性的总结:
— 提供的API可以让开发人员写出测试结果明确的可重用单元测试用例。
— 提供了多种方式来显示测试结果,而且可以扩展。
— 提供了单元测试批量运行的功能,而且可以和Ant很容易地整合。
— 对不同性质的被测对象,如Class,JSP,Servlet等,JUnit有不同的测试方法。
8.1.2 为什么要使用JUnit
以前,开发人员写一个方法,如下代码所示:
//******* AddAndSub.java**************
public Class AddAndSub {
public static int add(int m, int n) {
int num = m + n;
return num;
}
public static int sub(int m, int n) {
int num = m - n;
return num;
}
}
如果要对AddAndSub类的add和sub方法进行测试,通常要在main里编写相应的测试方法,如下代码所示:
//******* MathComputer.java**************
public Class AddAndSub {
public static int add(int m, int n) {
int num = m + n;
return num;
}
public static int sub(int m, int n) {
int num = m - n;
return num;
}
public static void main(String args[]) {
if (add (4, 6) == 10)) {
System.out.println(“Test Ok”);
} else {
System.out.println(“Test Fail”);
}
if (sub (6, 4) ==2)) {
System.out.println(“Test Ok”);
} else {
System.out.println(“Test Fail”);
}
}
}
从上面的测试可以看出,业务代码和测试代码放在一起,对于复杂的业务逻辑,一方面代码量会非常庞大,另一方面测试代码会显得比较凌乱,而JUnit就能改变这样的状况,它提供了更好的方法来进行单元测试。使用JUnit来测试前面代码的示例如下:
//******* TestAddAndSub.java**************
import junit.framework.TestCase;
public Class TestAddAndSub extends TestCase {
public void testadd() {
//断言计算结果与10是否相等
assertEquals(10, AddAndSub.add(4, 6));
}
public void testsub() {
//断言计算结果与2是否相等
assertEquals(2, AddAndSub.sub(6, 4));
}
public static void main(String args[]){
junit.textui.TestRunner.run(TestAddAndSub .class); }
}
这里先不对JUnit的使用方法进行讲解,从上可以看到,测试代码和业务代码分离开,使得代码比较清晰,如果将JUnit放在Eclipse中,测试起来将会更加方便。
8.2 建立JUnit的开发环境
为了不使读者在环节配置上浪费太多时间,这里将一步一步地讲解如何下载和配置JUnit。具体步骤如下:
8.2.1 下载JUnit
从www.junit.org可以进入到JUnit的首页,JUnit的首页画面如图8.1所示。
本书使用的版本是4.3版本,单击“Junit4.3.zip”即可进入下载JUnit的画面,如图8.2所示。
下载Junit4.3.zip,下载后解压缩即可。
8.2.2 配置JUnit
下载Junit4.3.zip完毕,并解压缩到D盘根目录下后,即可开始配置环境变量。用前面介绍的设定系统变量的方法,设定ClassPath,ClassPath=***;D:"junit"junit.jar,如图8.3所示。
图8.1 JUnit的首页画面
图8.2 下载JUnit的画面
查看是否配置好JUnit,在类里添加如下语句:
import junit.framework.TestCase;
图8.3 设定系统变量ClassPath
如果编译没有错误,则说明配置成功。
8.3 JUnit的使用方法
JUnit的使用非常简单,共有3步:第一步、编写测试类,使其继承TestCase;第二步、编写测试方法,使用test+×××的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用setUp,tearDown方法。
8.3.1 继承TestCase
如果要使用JUnit,则测试类都必须继承TestCase。当然目前的最新版JUnit是不需要继承它的,但并不是说TestCase类就没有用了,它仍然是JUnit工作的基础。这里先讲述继承TestCase类的方式,稍后再介绍不继承的方式。
下面是前面使用JUnit进行测试AddAndSub类的代码,这里进行详细的分析:
//******* TestAddAndSub.java**************
import junit.framework.TestCase;
public Class TestAddAndSub extends TestCase {
public void testadd() {
//断言计算结果与10是否相等
assertEquals(10, AddAndSub.add(4, 6));
}
public void testsub() {
//断言计算结果与2是否相等
assertEquals(2, AddAndSub.sub(6, 4));
}
public static void main(String args[]){
junit.textui.TestRunner.run(TestAddAndSub .class); }
}
代码说明:
— 这里继承TestCase,表示该类是一个测试类。
— 然后使用junit.textui.TestRunner.run方法来执行这个测试类。
这里给出TestCase的源代码:
//******* TestCase.java**************
package junit.framework;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public abstract class TestCase extends Assert implements Test {
/**测试案例的名称*/
private String fName;
/**构造函数
*/
public TestCase() {
fName= null;
}
/**带参数的构造函数
*/
public TestCase(String name) {
fName= name;
}
/**获取被run执行的测试案例的数量
*/
public int countTestCases() {
return 1;
}
/**创建一个TestResult
* @see TestResult
*/
protected TestResult createResult() {
return new TestResult();
}
/**执行run方法,返回TestResult
* @see TestResult
*/
public TestResult run() {
TestResult result= createResult();
run(result);
return result;
}
/**执行run方法,参数为TestResult
*/
public void run(TestResult result) {
result.run(this);
}
/**执行测试方法,包括初始化和销毁方法
* @throws Throwable if any exception is thrown
*/
public void runBare() throws Throwable {
Throwable exception= null;
setUp();
try {
runTest();
} catch (Throwable running) {
exception= running;
}
finally {
try {
tearDown();
} catch (Throwable tearingDown) {
if (exception == null) exception= tearingDown;
}
}
if (exception != null) throw exception;
}
/**执行测试方法
* @throws Throwable if any exception is thrown
*/
protected void runTest() throws Throwable {
assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
Method runMethod= null;
try {
//利用反射机制
runMethod= getClass().getMethod(fName, (Class[])null);
} catch (NoSuchMethodException e) {
fail("Method """+fName+""" not found");
}
if (!Modifier.isPublic(runMethod.getModifiers())) {
fail("Method """+fName+""" should be public");
}
//利用反射机制
try {
runMethod.invoke(this);
}
catch (InvocationTargetException e) {
e.fillInStackTrace();
throw e.getTargetException();
}
catch (IllegalAccessException e) {
e.fillInStackTrace();
throw e;
}
}
/**测试前的初始化方法
*/
protected void setUp() throws Exception {
}
/**测试后的销毁方法
*/
protected void tearDown() throws Exception {
}
/**返回测试案例的名称
* @return the name of the TestCase
*/
public String getName() {
return fName;
}
/**设定测试案例的名称
* @param name the name to set
*/
public void setName(String name) {
fName= name;
}
}
代码说明:
— 该类继承了Assert 类,实现了Test接口。
— 可以看出,TestCase类正是通过runBare实现了在测试方法前初始化相关变量和环境,在测试方法后销毁相关变量和环境。
8.3.2 编写测试方法
测试方法名要以test+方法名来命名,当然最新版的JUnit支持直接以方法名来命名测试方法。这是通过TestCase类里的runTest方法来实现的,主要利用了Java的反射机制,runTest方法的代码如下:
protected void runTest() throws Throwable {
assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
Method runMethod= null;
try {
// 获取要测试的方法
runMethod= getClass().getMethod(fName, (Class[])null);
} catch (NoSuchMethodException e) {
fail("Method """+fName+""" not found");
}
//判断要测试的方法是否为公用方法
if (!Modifier.isPublic(runMethod.getModifiers())) {
fail("Method """+fName+""" should be public");
}
//Java的反射机制
try {
runMethod.invoke(this);
}
//抛出调用异常
catch (InvocationTargetException e) {
e.fillInStackTrace();
throw e.getTargetException();
}
catch (IllegalAccessException e) {
e.fillInStackTrace();
throw e;
}
}
8.3.3 编写断言
JUnit主要有以下断言:
— assertEquals(期望值,实际值),检查两个值是否相等。
— assertEquals(期望对象,实际对象),检查两个对象是否相等,利用对象的equals()方法进行判断。
— assertSame(期望对象,实际对象),检查具有相同内存地址的两个对象是否相等,利用内存地址进行判断,注意和上面assertEquals方法的区别。
— assertNotSame(期望对象,实际对象),检查两个对象是否不相等。
— assertNull(对象1,对象2),检查一个对象是否为空。
— assertNotNull(对象1,对象2),检查一个对象是否不为空。
— assertTrue(布尔条件),检查布尔条件是否为真。
— assertFalse(布尔条件),检查布尔条件是否为假。
这些断言主要定义在JUnit的Assert类里,Assert类的示例代码如下:
//******* Assert.java**************
package junit.framework;
/**一系列的断言方法
*/
public class Assert {
/**构造函数
*/
protected Assert() {
}
/**断言是否为真,带消息
*/
static public void assertTrue(String message, boolean condition) {
if (!condition)
fail(message);
}
/**断言是否为真
*/
static public void assertTrue(boolean condition) {
assertTrue(null, condition);
}
/**断言是否为假,带消息
*/
static public void assertFalse(String message, boolean condition) {
assertTrue(message, !condition);
}
/**断言是否为假
*/
static public void assertFalse(boolean condition) {
assertFalse(null, condition);
}
/**断言是否为失败
*/
static public void fail(String message) {
throw new AssertionFailedError(message);
}
/**断言是否为失败
*/
static public void fail() {
fail(null);
}
/**是否相等的断言,带消息Object
*/
static public void assertEquals(String message, Object expected, Object actual) {
if (expected == null && actual == null)
return;
if (expected != null && expected.equals(actual))
return;
failNotEquals(message, expected, actual);
}
/**是否相等的断言,Object
*/
static public void assertEquals(Object expected, Object actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息String
*/
static public void assertEquals(String message, String expected, String actual) {
if (expected == null && actual == null)
return;
if (expected != null && expected.equals(actual))
return;
throw new ComparisonFailure(message, expected, actual);
}
/**是否相等的断言,String
*/
static public void assertEquals(String expected, String actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息double
*/
static public void assertEquals(String message, double expected, double actual, double delta) {
if (Double.compare(expected, actual) == 0)
return;
if (!(Math.abs(expected-actual) <= delta))
failNotEquals(message, new Double(expected), new Double(actual));
}
/**是否相等的断言,double
*/
static public void assertEquals(double expected, double actual, double delta) {
assertEquals(null, expected, actual, delta);
}
/**是否相等的断言,带消息float
*/
static public void assertEquals(String message, float expected, float actual, float delta) {
if (Float.compare(expected, actual) == 0)
return;
if (!(Math.abs(expected - actual) <= delta))
failNotEquals(message, new Float(expected), new Float(actual));
}
/**是否相等的断言, float
*/
static public void assertEquals(float expected, float actual, float delta) {
assertEquals(null, expected, actual, delta);
}
/**是否相等的断言,带消息long
*/
static public void assertEquals(String message, long expected, long actual) {
assertEquals(message, new Long(expected), new Long(actual));
}
/**是否相等的断言, long
*/
static public void assertEquals(long expected, long actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息boolean
*/
static public void assertEquals(String message, boolean expected, boolean actual) {
assertEquals(message, Boolean.valueOf(expected), Boolean.valueOf(actual));
}
/**是否相等的断言,boolean
*/
static public void assertEquals(boolean expected, boolean actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息byte
*/
static public void assertEquals(String message, byte expected, byte actual) {
assertEquals(message, new Byte(expected), new Byte(actual));
}
/**是否相等的断言, byte
*/
static public void assertEquals(byte expected, byte actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息char
*/
static public void assertEquals(String message, char expected, char actual) {
assertEquals(message, new Character(expected), new Character(actual));
}
/**是否相等的断言,char
*/
static public void assertEquals(char expected, char actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息short
*/
static public void assertEquals(String message, short expected, short actual) {
assertEquals(message, new Short(expected), new Short(actual));
}
/**是否相等的断言,short
static public void assertEquals(short expected, short actual) {
assertEquals(null, expected, actual);
}
/**是否相等的断言,带消息int
*/
static public void assertEquals(String message, int expected, int actual) {
assertEquals(message, new Integer(expected), new Integer(actual));
}
/**是否相等的断言,int
*/
static public void assertEquals(int expected, int actual) {
assertEquals(null, expected, actual);
}
/**是否不为null的断言 Object
*/
static public void assertNotNull(Object object) {
assertNotNull(null, object);
}
/**是否不为null的断言,带消息Object
*/
static public void assertNotNull(String message, Object object) {
assertTrue(message, object != null);
}
/**是否为null的断言Object
*/
static public void assertNull(Object object) {
assertNull(null, object);
}
/**是否为null的断言,带消息Object
*/
static public void assertNull(String message, Object object) {
assertTrue(message, object == null);
}
/**是否相同的断言,带消息*/
static public void assertSame(String message, Object expected, Object actual) {
if (expected == actual)
return;
failNotSame(message, expected, actual);
}
/**是否相同的断言,Object
*/
static public void assertSame(Object expected, Object actual) {
assertSame(null, expected, actual);
}
/**是否不相同的断言,带消息
*/
static public void assertNotSame(String message, Object expected, Object actual) {
if (expected == actual)
failSame(message);
}
/**是否不相同的断言Object
*/
static public void assertNotSame(Object expected, Object actual) {
assertNotSame(null, expected, actual);
}
/**相同时失败
*/
static public void failSame(String message) {
String formatted= "";
if (message != null)
formatted= message+" ";
fail(formatted+"expected not same");
}
/**不相同时失败
*/
static public void failNotSame(String message, Object expected, Object actual) {
String formatted= "";
if (message != null)
formatted= message+" ";
fail(formatted+"expected same:<"+expected+"> was not:<"+actual+">");
}
/**不相等时失败
*/
static public void failNotEquals(String message, Object expected, Object actual) {
fail(format(message, expected, actual));
}
/**格式化消息
*/
public static String format(String message, Object expected, Object actual) {
String formatted= "";
if (message != null)
formatted= message+" ";
return formatted+"expected:<"+expected+"> but was:<"+actual+">";
}
}
从上述代码中,读者可以研读JUnit中有关断言的实现方式,其实,最终都是使用后面的几个static方法来实现的。
JUnit是一个开源的Java单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。
回答: 2021-12-17 09:31
JUnit是一个开源的Java单元测试框架
相关问题推荐
虽然从事开发行业的女生越来越多,但女生的比例还是远比不上男生。软件测试的男女生比例则基本相当,软件测试要求细心、耐心,大部分女生也是比较适合学的。而且软件测试课程分为手工测试和自动化测试,手工测试分为功能测试、性能测试、接口测试。自动化测试...
需要。很多人当初抱着测试不需要懂代码,才选择了这个行业,这个就要看对自己的职业定位了,是止步于月薪过万就可以了,还是往20k、30k去突破,如果这样的话,是肯定要会接口、会自动化,就必然要涉及到代码。如果真的看不懂代码,实际的测试后期的工作会出现...
在我看来游戏开发挺难的,尤其像手游一类的还有网游,里面有很多的程序代码而且伤神又费力,不过也有女生在这方面做的很好的,如果你感兴趣,非常想学,可以试试
软件测试专业现在很火热,很缺少人才,25岁学软件测试能学会,就业薪资也高,工作也相对轻松
测试类型有:功能测试,性能测试,界面测试。功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用...
这个其实和接口测试的场景密不可分的,比如说:外部接口测试: 必须先接口测试通过了,才能执行功能测试子系统或者各个模块之间的联调测试: 必须各子系统后台代码完成,并提供接口才可以完成测试,一般来说都要求各子系统功能测试通过后再进行...
这个是会因为公司的架构不同而不同的,并不是固定的,但是一般是会有专门的测试部门,或者叫质量保证部,也有可能是叫别的名字。
移动端测试,包括App兼容性测dao试,7*24小时稳定性测试,功耗性能测试,UI测试,交互测试等,课程主要学习的内容有:1、功能测试主要包括计算机基础、软件测试核心理论、Linux、数据库,学习目标是掌握软件测试核心理论,结合Linux、数据库等可实现移动端、w...
标题 1. 首先要做一个标题党(此标题党非彼标题党)。标题一定要清晰简洁易理解,不应该臃长 2. 尽量前缀要规范,例如模板: [Product][Version]_[Feature]_[Title],这样描述会很清晰,也方便查找 3. 缺陷的标题一定要描述在什么情况下发生了什么问...
1、 缺陷报告可以记录缺陷2、可以对缺陷进行跟踪管理3、可以对缺陷报告进行分类 总结 统计
1、缺陷编号(Defect ID),提交BUG的顺序。2、缺陷标题(summary),简明扼要的说明一下这个BUG。3、缺陷的发现者(DetectedBy) ,一般是自己。4、发现缺陷的日期(Detected on date),一般是当天。5、缺陷所属的模块(subject), 在测试哪个模块的时候发现的BUG...
缺陷标题好的缺陷标题需要让相关人员一目了然,一般建议的格式是条件+失败。缺陷类型缺陷类型也是根据具体的项目而定的。但一般情况下分为功能、界面、建议。重现步骤重现步骤的编写规则可以参考测试用例中的操作步骤 ,一定要足够详细、说明清楚问题的操作顺...
工具:NoSQLUnitJsTestDriverQTRunnerVenusFluintBuster.JSSQLUnitECUTQTestlibUnitilsgreatestDbUnitAbbotGoogleTest框架:JUnitMoqJSCaptureMockCUnitPyUnitCppUTestCppUnitzCUTcipra
JunitTestNGGoogleTestpytestunittestJmockitJaCoCogcov、lcov、gcovrCoverage.pyEvoSuiteDiffblue Cover
React Hooks测试库( Testing Library)是一个简单而完整的React Hooks测试工具。 React Hooks测试库让用户可以为React钩子创建简单的测试工具,自定义钩子的输入和检索输出,以处理在功能组件体内运行的情况。 使用React Hooks,用户不必为了测试而去担...
1、单元测试注重代码逻辑,接口测试注重业务逻辑;2、单元测试的粒度最小,是测试最小独立的单元模块(不依赖其他模块);接口测试不是,会覆盖很多;3、单元测试是白盒测试,接口测试是黑盒测试;4、单元测试关注的是代码的实现和逻辑,测试范围较小,保证实...