Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Use JUnit CN
本文论述如何在Eclipse 中使用JUnit 进行单元测试。
Contents
基本概念
- TestCase - 测试用例,子类继承它可以实现一个或多个测试用例。一般子类命名以Test 结尾,可以理解为单个类的测试用例集合。
- TestSuite - 测试套件,子类继承它来组织已有的测试类。一般子类命名以Tests 结尾,可以理解为多个类的测试用例集合。
- TestRunner - 测试用例或测试套件的运行器。Eclipse 里有自己的Runner 用以方便测试类的运行。
举例说明
- 新建sample 项目,源文件夹为src。
- 新建并实现Triangle 类,包名为com.ime.sample。
- 新建源文件夹test。
- 新建并实现TriangleTest 类,包名为com.ime.sample.test。
- 使用JUnit 运行TriangleTest。
- 重构TriangleTest 和Triangle 类。
与Ant 结合生成测试报告
- 新建并实现build.xml 文件在sample 项目中。
- 使用Ant 运行build.xml。
- 在浏览器中查看测试报告。
文件的源代码
- sample.Triangle:
package sample; /** * This is Triangle class */ public class Triangle { // 定义三角形的三边 protected long lborderA = 0; protected long lborderB = 0; protected long lborderC = 0; // 构造函数 public Triangle(long lborderA, long lborderB, long lborderC) { this.lborderA = lborderA; this.lborderB = lborderB; this.lborderC = lborderC; } /** * 判断是否是三角形 * * 是返回ture;不是返回false */ public static boolean isTriangle(Triangle triangle) { boolean isTriangle = false; // 判断边界,大于0 小于或等于Long.MAX_VALUE,出界返回false if ((triangle.lborderA > 0 && triangle.lborderA <= Long.MAX_VALUE / 2) && (triangle.lborderB > 0 && triangle.lborderB <= Long.MAX_VALUE / 2) && (triangle.lborderC > 0 && triangle.lborderC <= Long.MAX_VALUE / 2)) { // 判断两边之和大于第三边 if ((triangle.lborderA < (triangle.lborderB + triangle.lborderC)) && (triangle.lborderB < (triangle.lborderA + triangle.lborderC)) && (triangle.lborderC < (triangle.lborderA + triangle.lborderB))) { isTriangle = true; } } return isTriangle; } /** * 判断三角形类型 * * 只有两条边相等的三角形返回字符串“等腰三角形”; 三边均相等的三角形返回字符串“等边三角形”; * 三边均不等的三角形返回字符串“不等边三角形”; */ public static String getType(Triangle triangle) { String strType = "不是三角形 "; // 判断是否是三角形 if (isTriangle(triangle)) { // 判断是否是等边三角形 if (triangle.lborderA == triangle.lborderB && triangle.lborderB == triangle.lborderC) { strType = "等边三角形"; } // 判断是否是不等边三角形 else if ((triangle.lborderA != triangle.lborderB) && (triangle.lborderB != triangle.lborderC) && (triangle.lborderA != triangle.lborderC)) { strType = "不等边三角形"; } // 三角形既非三边全部相等,又非全部不等,只能是部分相等即等腰三角形 else { strType = "等腰三角形"; } } return strType; } }
- sample.TriangleTest:
package sample; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Tests about <code>Triangle</code> class. * * @author yangyz@NEUSOFT */ public class TriangleTest extends TestCase { public Triangle triangle = null; public static Test suite() { return new TestSuite(TriangleTest.class); } /** * Test for Triangle#isTriangle().<p> * * Setup: lborderA = 0; lborderB = 3; lborderC = 3<br> * Expected: method returns false */ public void testIsTriangle01() { // setup triangle = new Triangle(0, 3, 3); // expected boolean expected = false; // execute boolean result = Triangle.isTriangle(triangle); // actual boolean actual = result; // assert assertEquals("While a=0; b=3; c=3 mehtod fails!", expected, actual); } /** * Test for Triangle#isTriangle().<p> * * Setup: lborderA = 3; lborderB = 3; lborderC = 3<br> * Expected: method returns true */ public void testIsTriangle02() { // setup triangle = new Triangle(3, 3, 3); // expected boolean expected = true; // execute boolean result = Triangle.isTriangle(triangle); // actual boolean actual = result; // assert assertEquals("While a=3; b=3; c=3 mehtod fails!", expected, actual); } /** * Test for Triangle#getType().<p> * * Setup: lborderA = 0; lborderB = 3; lborderC = 3<br> * Expected: method returns "不是三角形" */ public void testGetType01() { // setup triangle = new Triangle(0, 1, 1); // expected String expected = "不是三角形"; // execute String result = Triangle.getType(triangle); // actual String actual = result; // assert assertEquals("While a=0; b=3; c=3 mehtod fails!", expected, actual); } /** * Test for Triangle#getType().<p> * * Setup: lborderA = 3; lborderB = 4; lborderC = 5<br> * Expected: method returns "不等边三角形" */ public void testGetType02() { // setup triangle = new Triangle(3, 4, 5); // expected String expected = "不等边三角形"; // execute String result = Triangle.getType(triangle); // actual String actual = result; // assert assertEquals("While a=3; b=4; c=5 mehtod fails!", expected, actual); } /** * Test for Triangle#getType().<p> * * Setup: lborderA = 3; lborderB = 3; lborderC = 3<br> * Expected: method returns "等边三角形" */ public void testGetType03() { // setup triangle = new Triangle(3, 3, 3); // expected String expected = "等边三角形"; // execute String result = Triangle.getType(triangle); // actual String actual = result; // assert assertEquals("While a=3; b=3; c=3 mehtod fails!", expected, actual); } /** * Test for Triangle#getType().<p> * * Setup: lborderA = 3; lborderB = 3; lborderC = 5<br> * Expected: method returns "等腰三角形" */ public void testGetType04() { // setup triangle = new Triangle(3, 3, 5); // expected String expected = "等腰三角形"; // execute String result = Triangle.getType(triangle); // actual String actual = result; // assert assertEquals("While a=3; b=3; c=5 mehtod fails!", expected, actual); } // 执行测试 public static void main(String[] args) { // Text ui 方式 // junit.textui.TestRunner.run(suite()); // Swing ui 方式 junit.swingui.TestRunner.run(TriangleTest.class); // AWT ui 方式 // junit.awtui.TestRunner.run(TriangleTest.class); } }
- build.xml:
<?xml version="1.0" encoding="UTF-8"?> <project name="sample.useJunitTest" default="all" basedir="."> <!--定义依赖环境的属性--> <!--property file="build.properties" /--> <!--属性的定义--> <property name="jar.name" value="sample.jar" /> <property name="src" value="src" /> <property name="build" value="build" /> <property name="jar.dir" value="${build}/jar" /> <property name="classes" value="${build}/classes" /> <!--定义单元测试的属性--> <property name="test.jar.name" value="sampletest.jar" /> <property name="test.src" value="testsrc" /> <property name="test.classes" value="${build}/testclasses" /> <property name="test.report.dir" value="${build}/report" /> <!--目标 --> <target name="all" depends="${jar.name}" /> <target name="${jar.name}" depends="compile"> <mkdir dir="${jar.dir}" /> <jar jarfile="${jar.dir}/${jar.name}" basedir="${classes}" /> </target> <target name="compile"> <mkdir dir="${classes}" /> <javac srcdir="${src}" destdir="${classes}" /> </target> <target name="${test.jar.name}" depends="test.compile"> <mkdir dir="${jar.dir}" /> <jar jarfile="${jar.dir}/${test.jar.name}" basedir="${test.classes}" /> </target> <target name="test.compile"> <mkdir dir="${test.classes}" /> <javac srcdir="${test.src}" destdir="${test.classes}"> <classpath> <fileset dir="${jar.dir}"> <include name="*.jar" /> </fileset> </classpath> </javac> </target> <target name="unit.test.report" depends="unit.test"> <junitreport todir="${test.report.dir}"> <fileset dir="${test.report.dir}"> <include name="TEST-*.xml" /> </fileset> <report format="frames" todir="${test.report.dir}/html" /> </junitreport> </target> <target name="unit.test" depends="${jar.name},${test.jar.name}"> <mkdir dir="${test.report.dir}" /> <junit printsummary="yes" haltonfailure="no"> <classpath> <fileset dir="${jar.dir}"> <include name="*.jar" /> </fileset> </classpath> <formatter type="xml" /> <batchtest fork="yes" todir="${test.report.dir}"> <fileset dir="${test.src}"> <include name="**/*Test.java" /> </fileset> </batchtest> </junit> </target> <target name="clean"> <delete dir="${build}" /> </target> </project>
使用测试框架进行插件的测试
- 下载Automated Testing for Custom Plugins 包,并解压缩到自定义的目录下(如:G:\Custom-plugin-testing)。
- 将解包的Eclipse SDK3.1.1 和Eclispe Test Framework3.1.1 解压缩到/eclipse-utp/ 目录下。
- 将做成的Test plugin 和Tested plugin 及依赖放到/eclipse-custom/目录下。
- 修改/label.properties 适配Build 信息。
- 修改/tests.xml、/tests.properties 添加自定义插件的测试任务。
- 双击/runt-cmd.bat,在命令行窗口中键入runtests [参数]运行测试。
- 查看在/generate/results 目录下生成的测试报告。