JAVA核心技术:JUnit

知识点

软件测试

  • 软件测试的经典定义是:

规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。

  • 软件测试分类
    • 单元 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个条件:

  1. 年份必须大于0,且小于等于10000。
  2. 年份不能整除100,且可以整除4。
  3. 年份可以整除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));
		}

	}
Files contained in junit4-4.8.2.jar: LICENSE.txt META-INF/MANIFEST.MF junit.extensions.ActiveTestSuite.class junit.extensions.RepeatedTest.class junit.extensions.TestDecorator.class junit.extensions.TestSetup.class junit.extensions.package-info.class junit.framework.Assert.class junit.framework.AssertionFailedError.class junit.framework.ComparisonCompactor.class junit.framework.ComparisonFailure.class junit.framework.JUnit4TestAdapter.class junit.framework.JUnit4TestAdapterCache.class junit.framework.JUnit4TestCaseFacade.class junit.framework.Protectable.class junit.framework.Test.class junit.framework.TestCase.class junit.framework.TestFailure.class junit.framework.TestListener.class junit.framework.TestResult.class junit.framework.TestSuite.class junit.framework.package-info.class junit.runner.BaseTestRunner.class junit.runner.TestRunListener.class junit.runner.Version.class junit.runner.package-info.class junit.textui.ResultPrinter.class junit.textui.TestRunner.class junit.textui.package-info.class org.hamcrest.BaseDescription.class org.hamcrest.BaseMatcher.class org.hamcrest.CoreMatchers.class org.hamcrest.Description.class org.hamcrest.Factory.class org.hamcrest.Matcher.class org.hamcrest.SelfDescribing.class org.hamcrest.StringDescription.class org.hamcrest.core.AllOf.class org.hamcrest.core.AnyOf.class org.hamcrest.core.DescribedAs.class org.hamcrest.core.Is.class org.hamcrest.core.IsAnything.class org.hamcrest.core.IsEqual.class org.hamcrest.core.IsInstanceOf.class org.hamcrest.core.IsNot.class org.hamcrest.core.IsNull.class org.hamcrest.core.IsSame.class org.hamcrest.internal.ArrayIterator.class org.hamcrest.internal.SelfDescribingValue.class org.hamcrest.internal.SelfDescribingValueIterator.class org.junit.After.class org.junit.AfterClass.class org.junit.Assert.class org.junit.Assume.class org.junit.Before.class org.junit.BeforeClass.class org.junit.ComparisonFailure.class org.junit.Ignore.class org.junit.Rule.class org.junit.Test.class org.junit.experimental.ParallelComputer.class org.junit.experimental.categories.Categories.class org.junit.experimental.categories.Category.class org.junit.experimental.max.CouldNotReadCoreException.class org.junit.experimental.max.MaxCore.class org.junit.experimental.max.MaxHistory.class org.junit.experimental.results.FailureList.class org.junit.experimental.results.PrintableResult.class org.junit.experimental.results.ResultMatchers.class org.junit.experimental.runners.Enclosed.class org.junit.experimental.theories.DataPoint.class org.junit.experimental.theories.DataPoints.class org.junit.experimental.theories.ParameterSignature.class org.junit.experimental.theories.ParameterSupplier.class org.junit.experimental.theories.ParametersSuppliedBy.class org.junit.experimental.theories.PotentialAssignment.class org.junit.experimental.theories.Theories.class org.junit.experimental.theories.Theory.class org.junit.experimental.theories.internal.AllMembersSupplier.class org.junit.experimental.theories.internal.Assignments.class org.junit.experimental.theories.internal.ParameterizedAssertionError.class org.junit.experimental.theories.suppliers.TestedOn.class org.junit.experimental.theories.suppliers.TestedOnSupplier.class org.junit.internal.ArrayComparisonFailure.class org.junit.internal.AssumptionViolatedException.class org.junit.internal.ComparisonCriteria.class org.junit.internal.ExactComparisonCriteria.class org.junit.internal.InexactComparisonCriteria.class org.junit.internal.JUnitSystem.class org.junit.internal.RealSystem.class org.junit.internal.TextListener.class org.junit.internal.builders.AllDefaultPossibilitiesBuilder.class org.junit.internal.builders.AnnotatedBuilder.class org.junit.internal.builders.IgnoredBuilder.class org.junit.internal.builders.IgnoredClassRunner.class org.junit.internal.builders.JUnit3Builder.class org.junit.internal.builders.JUnit4Builder.class org.junit.internal.builders.NullBuilder.class org.junit.internal.builders.SuiteMethodBuilder.class org.junit.internal.matchers.CombinableMatcher.class org.junit.internal.matchers.Each.class org.junit.internal.matchers.IsCollectionContaining.class org.junit.internal.matchers.StringContains.class org.junit.internal.matchers.SubstringMatcher.class org.junit.internal.matchers.TypeSafeMatcher.class org.junit.internal.requests.ClassRequest.class org.junit.internal.requests.FilterRequest.class org.junit.internal.requests.SortingRequest.class org.junit.internal.requests.package-info.class org.junit.internal.runners.ClassRoadie.class org.junit.internal.runners.ErrorReportingRunner.class org.junit.internal.runners.FailedBefore.class org.junit.internal.runners.InitializationError.class org.junit.internal.runners.JUnit38ClassRunner.class org.junit.internal.runners.JUnit4ClassRunner.class org.junit.internal.runners.MethodRoadie.class org.junit.internal.runners.MethodValidator.class org.junit.internal.runners.SuiteMethod.class org.junit.internal.runners.TestClass.class org.junit.internal.runners.TestMethod.class org.junit.internal.runners.model.EachTestNotifier.class org.junit.internal.runners.model.MultipleFailureException.class org.junit.internal.runners.model.ReflectiveCallable.class org.junit.internal.runners.package-info.class org.junit.internal.runners.statements.ExpectException.class org.junit.internal.runners.statements.Fail.class org.junit.internal.runners.statements.FailOnTimeout.class org.junit.internal.runners.statements.InvokeMethod.class org.junit.internal.runners.statements.RunAfters.class org.junit.internal.runners.statements.RunBefores.class org.junit.matchers.JUnitMatchers.class org.junit.matchers.package-info.class org.junit.package-info.class org.junit.rules.ErrorCollector.class org.junit.rules.ExpectedException.class org.junit.rules.ExternalResource.class org.junit.rules.MethodRule.class org.junit.rules.TemporaryFolder.class org.junit.rules.TestName.class org.junit.rules.TestWatchman.class org.junit.rules.Timeout.class org.junit.rules.Verifier.class org.junit.runner.Computer.class org.junit.runner.Describable.class org.junit.runner.Description.class org.junit.runner.JUnitCore.class org.junit.runner.Request.class org.junit.runner.Result.class org.junit.runner.RunWith.class org.junit.runner.Runner.class org.junit.runner.manipulation.Filter.class org.junit.runner.manipulation.Filterable.class org.junit.runner.manipulation.NoTestsRemainException.class org.junit.runner.manipulation.Sortable.class org.junit.runner.manipulation.Sorter.class org.junit.runner.manipulation.package-info.class org.junit.runner.notification.Failure.class org.junit.runner.notification.RunListener.class org.junit.runner.notification.RunNotifier.class org.junit.runner.notification.StoppedByUserException.class org.junit.runner.notification.package-info.class org.junit.runner.package-info.class org.junit.runners.AllTests.class org.junit.runners.BlockJUnit4ClassRunner.class org.junit.runners.JUnit4.class org.junit.runners.Parameterized.class org.junit.runners.ParentRunner.class org.junit.runners.Suite.class org.junit.runners.model.FrameworkField.class org.junit.runners.model.FrameworkMember.class org.junit.runners.model.FrameworkMethod.class org.junit.runners.model.InitializationError.class org.junit.runners.model.RunnerBuilder.class org.junit.runners.model.RunnerScheduler.class org.junit.runners.model.Statement.class org.junit.runners.model.TestClass.class org.junit.runners.package-info.class org/hamcrest/core/package.html org/hamcrest/package.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值