JUnit单元测试

单元测试使用JUnit 5 1. JUnit 是什么?JUnit 是一个 Java 编程语言的开源测试框架,它是xUnit架构的一部分,xUnit是为多种编程语言创建的单元测试库的通用名称。JUnit是由Erich Gamma和Kent Beck创建的,目前已经发展到JUnit 5。它提供了一些功能,使编写测试变得容易,包括支持多个测试用例、断言和报告。JUnit也是多功能的,允许用各种语言编写测试。JUnit 主要用于单元测试,但它也可用于其他测试,如功能和集成测试。功能测试是测试系统的功能。 阅读详情

概述

JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立

github地址

https://github.com/junit-team/junit4

Junit官网

http://junit.org/junit4

注:主要是翻译,但是并没有翻译全文。

入门

这个小例子展示了如何写一个单元测试。你需要安装jdk,有文本编辑器。

准备

创建一个jnnit-example文件夹,下载并引入junit的jar包,所有的文件都在那个文件夹下创建,命令也是在那执行。
创建Caculator.java文件
public class Calculator {
  public int evaluate(String expression) {
    int sum = 0;
    for (String summand: expression.split("\\+"))
      sum += Integer.valueOf(summand);
    return sum;
  }
}
编译文件
javac Calculator.java
编译之后会生成Calculator.class文件

创建单元测试

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}
在linux或者mac上编译
javac -cp .:junit-4.XX.jar CalculatorTest.java
在windows上编译
javac -cp .;junit-4.XX.jar CalculatorTest.java
执行单元测试
在linux或者mac平台上
java -cp .:junit-4.XX.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest
在winddows平台上
java -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar org.junit.runner.JUnitCore CalculatorTest

输出

JUnit version 4.12
.
Time: 0,006

OK (1 test)
这是执行成功的输出结果。
如果执行错误,错误的输出样例
JUnit version 4.12
.E
Time: 0,007
There was 1 failure:
1) evaluatesExpression(CalculatorTest)
java.lang.AssertionError: expected:<6> but was:<-6>
  at org.junit.Assert.fail(Assert.java:88)
  ...

FAILURES!!!
Tests run: 1,  Failures: 1
错误信息提示我们,期待的结果是6,但是实际输出为-6,代码88行。

Enclosed使用

采用封闭式的TestTunner的例子
通常我们需要每一个抽象类的子类,使用Enclosed runer,就可以用同一个测试用例类的静态内部类。
public class Address implements Serializable, Comparable<Address> {

    private static final long serialVersionUID = 1L;
    private final String address1;
    private final String city;
    private final String state;
    private final String zip;

    private Address(Builder builder) {
        this.address1 = builder.address1;
        this.city = builder.city;
        this.state = builder.state;
        this.zip = builder.zip;
    }

    public String getAddress1() {
        return address1;
    }

    public String getCity() {
        return city;
    }

    public String getState() {
        return state;
    }

    public String getZip() {
        return zip;
    }

    @Override
    public int compareTo(Address that) {
        return ComparisonChain.start().compare(this.zip, that.zip).compare(this.state, that.state)
                .compare(this.city, that.city).compare(this.address1, that.address1).result();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) { return false; }
        if (getClass() != obj.getClass()) { return false; }
        final Address that = (Address) obj;

        return com.google.common.base.Objects.equal(this.address1, that.address1)
                && com.google.common.base.Objects.equal(this.city, that.city)
                && com.google.common.base.Objects.equal(this.state, that.state)
                && com.google.common.base.Objects.equal(this.zip, that.zip);
    }

    @Override
    public int hashCode() {
        return com.google.common.base.Objects.hashCode(getAddress1(), getCity(), getCity(), getState(), getZip());
    }

    @Override
    public String toString() {
        return com.google.common.base.Objects.toStringHelper(this).addValue(getAddress1()).addValue(getCity()).addValue(getState()).addValue(getZip()).toString();
    }

    public static class Builder {

        private String address1;
        private String city;
        private String state;
        private String zip;

        public Builder address1(String address1) {
            this.address1 = address1;
            return this;
        }

        public Address build() {
            return new Address(this);
        }

        public Builder city(String city) {
            this.city = city;
            return this;
        }

        public Builder state(String state) {
            this.state = state;
            return this;
        }

        public Builder zip(String zip) {
            this.zip = zip;
            return this;
        }
    }
}

/**
 * The Class AddressTest.
 */
@RunWith(Enclosed.class)
public class AddressTest {

    /**
     * The Class AddressComparabilityTest.
     */
    public static class AddressComparabilityTest extends ComparabilityTestCase<Address> {

        @Override
        protected Address createEqualInstance() throws Exception {
            return new Address.Builder().address1("2802 South Havana Street").city("Aurora").state("CO").zip("80014").build();
        }

        @Override
        protected Address createGreaterInstance() throws Exception {
            return new Address.Builder().address1("9839 Carlisle Boulevard NE").city("Albuquerque").state("NM").zip("87110").build();
        }

        @Override
        protected Address createLessInstance() throws Exception {
            return new Address.Builder().address1("14 Broad St").city("Nashua").state("NH").zip("03064").build();
        }
    }

    /**
     * The Class AddressEqualsHashCodeTest.
     */
    public static class AddressEqualsHashCodeTest extends EqualsHashCodeTestCase {

        @Override
        protected Address createInstance() throws Exception {
            return new Address.Builder().address1("2802 South Havana Street").city("Aurora").state("CO").zip("80014").build();
        }

        @Override
        protected Address createNotEqualInstance() throws Exception {
            return new Address.Builder().address1("9839 Carlisle Boulevard NE").city("Albuquerque").state("NM").zip("87110").build();
        }
    }

    /**
     * The Class AddressSerializabilityTest.
     */
    public static class AddressSerializabilityTest extends SerializabilityTestCase {

        @Override
        protected Serializable createInstance() throws Exception {
            return new Address.Builder().address1("9839 Carlisle Boulevard NE").city("Albuquerque").state("NM").zip("87110").build();
        }
    }

    public static class AddressMiscTest {

        private Address address;

        /**
         * Setup.
         *
         * @throws Exception the exception
         */
        @Before
        public void setUp() throws Exception {
            address = new Address.Builder().address1("9839 Carlisle Boulevard NE").city("Albuquerque").state("NM").zip("87110").build();
        }

        /**
         * Test builder.
         */
        @Test
        public void testBuilder() {
            assertThat(address.getAddress1(), is("9839 Carlisle Boulevard NE"));
            assertThat(address.getCity(), is("Albuquerque"));
            assertThat(address.getState(), is("NM"));
            assertThat(address.getZip(), is("87110"));
        }

        @Test
        public void testToString() {
            assertThat(address.toString(), is("Address{9839 Carlisle Boulevard NE, Albuquerque, NM, 87110}"));
        }
    }
}

测试套件Suite

使用Suite可以构建包含多个单元测试的套件,Junit4中使用注解,相关于JUnit3.8中的Test.suite()方法,
使用示例
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
  TestFeatureLogin.class,
  TestFeatureLogout.class,
  TestFeatureNavigate.class,
  TestFeatureUpdate.class
})

public class FeatureTestSuite {
  // the class remains empty,
  // used only as a holder for the above annotations
}

断言方法Assert

JUnit 为基本类型和对象以及数组(基本类型或对象)提供了重载的断言方法。参数的顺序是期望值和实际值。可选的第一个值是错误情况的消息。有一个略微不同的断言是 assertThat 它需要的参数是一个可选的失败消息,实际返回值和一个 Matcher 对象。值得注意的是,预期的和实际的是相反的相比其他断言方法。
有代表性的断言方法示例
public class AssertTests {
  @Test
  public void testAssertArrayEquals() {
    byte[] expected = "trial".getBytes();
    byte[] actual = "trial".getBytes();
    org.junit.Assert.assertArrayEquals("failure - byte arrays not same", expected, actual);
  }

  @Test
  public void testAssertEquals() {
    org.junit.Assert.assertEquals("failure - strings are not equal", "text", "text");
  }

  @Test
  public void testAssertFalse() {
    org.junit.Assert.assertFalse("failure - should be false", false);
  }

  @Test
  public void testAssertNotNull() {
    org.junit.Assert.assertNotNull("should not be null", new Object());
  }

  @Test
  public void testAssertNotSame() {
    org.junit.Assert.assertNotSame("should not be same Object", new Object(), new Object());
  }

  @Test
  public void testAssertNull() {
    org.junit.Assert.assertNull("should be null", null);
  }

  @Test
  public void testAssertSame() {
    Integer aNumber = Integer.valueOf(768);
    org.junit.Assert.assertSame("should be same", aNumber, aNumber);
  }

  // JUnit Matchers assertThat
  @Test
  public void testAssertThatBothContainsString() {
    org.junit.Assert.assertThat("albumen", both(containsString("a")).and(containsString("b")));
  }

  @Test
  public void testAssertThathasItemsContainsString() {
    org.junit.Assert.assertThat(Arrays.asList("one", "two", "three"), hasItems("one", "three"));
  }

  @Test
  public void testAssertThatEveryItemContainsString() {
    org.junit.Assert.assertThat(Arrays.asList(new String[] { "fun", "ban", "net" }), everyItem(containsString("n")));
  }

  // Core Hamcrest Matchers with assertThat
  @Test
  public void testAssertThatHamcrestCoreMatchers() {
    assertThat("good", allOf(equalTo("good"), startsWith("good")));
    assertThat("good", not(allOf(equalTo("bad"), equalTo("good"))));
    assertThat("good", anyOf(equalTo("bad"), equalTo("good")));
    assertThat(7, not(CombinableMatcher.<Integer> either(equalTo(3)).or(equalTo(4))));
    assertThat(new Object(), not(sameInstance(new Object())));
  }

  @Test
  public void testAssertTrue() {
    org.junit.Assert.assertTrue("failure - should be true", true);
  }
}

Assume的使用

Assume直译为假设,是JUnit提供的一套用于判断测试用例的入参是否有业务含义的工具,如果入参不符合预期时会抛出AssumptionViolatedException,默认的BlockJUnit4ClassRunner及其子类会捕获这个异常并跳过当前测试,如果使用自定义的Runner则无法保证行为,视Runner的实现而定。 
Assume提供的验证方法包括: assumeTrue/assumeFalse、 assumeNotNull、 assumeThat、 assumeNoException 。具体含义都比较简单。

Rule的使用

定义测试方法行为的规则,JUnit4中包含两个注解@Rule和@ClassRule用于修饰Field或返回Rule的 Method,Rule是一组实现了TestRule接口的共享类,提供了验证、监视TestCase和外部资源管理等能力。JUnit提供了以下几个Rule实现,必要时也可以自己实现Rule。
Verifier: 验证测试执行结果的正确性。
ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。
ExpectedException: 提供灵活的异常验证功能。
Timeout: 用于测试超时的Rule。
ExternalResource: 外部资源管理。
TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。
TestWatcher: 监视测试方法生命周期的各个阶段。
TestName: 在测试方法执行过程中提供获取测试名字的能力。
示例代码太多,就不粘贴代码了,
详情: https://github.com/junit-team/junit4/wiki/Rules

抛出异常的测试

@Test(expected = IndexOutOfBoundsException.class) 
public void empty() { 
     new ArrayList<Object>().get(0); 
}
expected参数要小心使用,以上代码当抛出IndexOutOfBoundsException异常时候测试才通过。更加建议使用ExpectedException rule
@Rule
public ExpectedException thrown = ExpectedException.none();

@Test
public void shouldTestExceptionMessage() throws IndexOutOfBoundsException {
    List<Object> list = new ArrayList<Object>();

    thrown.expect(IndexOutOfBoundsException.class);
    thrown.expectMessage("Index: 0, Size: 0");
    list.get(0); // execution will never get past this line
}
这篇博客有详细描述 博客原文

超时处理

@Test(timeout=1000)
public void testWithTimeout() {
  ...
}
您还可以指定以毫秒为单位设置超时,如果超过了时间限制,会抛出一个超时异常。
如果测试运行超过规定的时间,会导致测试失败,JUnit将中断测试线程。
超时规则
超时规则适用在一个类中的所有测试方法
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.Timeout;

public class HasGlobalTimeout {
    public static String log;
    private final CountDownLatch latch = new CountDownLatch(1);

    @Rule
    public Timeout globalTimeout = Timeout.seconds(10); // 10 seconds max per method tested

    @Test
    public void testSleepForTooLong() throws Exception {
        log += "ran1";
        TimeUnit.SECONDS.sleep(100); // sleep for 100 seconds
    }

    @Test
    public void testBlockForever() throws Exception {
        log += "ran2";
        latch.await(); // will block 
    }
}


欢迎扫描二维码,关注公众账号

IDEA中使用JUnit4单元测试 本文介绍JUnit单元测试的重要性,然后详细介绍了使用IDEA工具搭建单元测试的步骤。 阅读详情

相关推荐

JUnit5 单元测试详解

文章介绍Java单元测试相关知识。单元测试针对软件最小可测试单元,能降低错误风险、提升代码质量。JUnit 5是流行的Java单元测试框架,引入方式有Maven和Gradle,也可从官方仓库下载jar包,可在项目结构中查看是否引入成功。编写单元测试时,类名遵循被测试类名+Test,方法用@Test注解,返回值为void且无参数,通过断言判断期望值和实际值。JUnit 5提供多种常用注解,可解决Scanner失效问题,还有忽略测试、超时测试等高级功能,合理使用可提升代码质量。

m0_73941339的博客 2746

IDEA中使用JUnit4(单元测试框架)超详细!

IDEA中使用JUnit4教程 超详细!(单元测试框架) 自动化测试的必经之路--Selenium

变优秀的小白的博客 15万+

最强解析!CWRU轴承数据集Python实战:从数据加载到模型部署全流程

本文提供了一份完整的CWRU轴承数据集Python实战指南,涵盖从数据加载、预处理、特征工程到模型构建与训练的全流程。详细解析了如何利用1D-CNN、Transformer等深度学习模型进行轴承故障诊断,并介绍了模型评估、可解释性分析以及通过FastAPI部署模型的实用方法,为工业设备智能运维提供了一套可复用的解决方案。

time3的博客 365

Junit4测试Spring注入

1、使用的jar      spring.jar     org.springframework.test-3.0.5.RELEASE.jar    //junit4测试所需jar     Junit.jar    org.hamcrest.core_1.1.0.v20090501071000.jar 2、注解 在类上的配置Annotation  @RunWith(SpringJUnit4Cla

luguling200802544的专栏 828

STM32硬件SPI驱动W5500以太网模块全流程(附避坑指南)

本文详细介绍了STM32硬件SPI驱动W5500以太网模块的全流程,包括硬件架构设计、SPI接口选型、官方驱动移植、网络协议栈配置与优化等关键步骤。通过实战案例和性能对比数据,帮助开发者快速实现稳定高效的网络连接,特别提供了常见问题排查指南和性能调优技巧。

weixin_29194693的博客 268

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 490

java中final变量

final类不允许被继承。 final方法不能被子类重写。 final基本变量值不可变。 final引用类型地址不变,值可以变。

Junit的博客 281

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1569

Mockito 也能 Mock final 类和 final 方法了

以实际 Java 项目中的单元测试 Mock 框架基本是 Mockito 了,因为它有一个十分流畅的 API。Mockito 也为 JUnit 5 配上了 MockitoExtension, 所以 JUnit 5 下使用 Mockito 的关节也打通了。但在我们享受 Mockito 便利的同时,与 JMockit 相比局限性就很明显,因为 Mockito 是通过创建匿名子类来进行 Mock 的,所...

一叶不知秋 1万+

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 445

Dify 第 4 篇 Dify 示例:数据库执行Agent

本文介绍了如何在Dify平台创建一个能够执行SQL查询的数据库Agent。通过安装并配置"通义千问"和"数据库"两个插件,实现自然语言到SQL语句的转换和执行。关键步骤包括:1)安装插件并配置API Key;2)设置默认数据库连接(建议使用只读账号);3)准备测试数据表结构。该Agent支持通过工具调用查询表结构、转换自然语言为SQL、执行查询并返回结果,同时提供了CSV查询和HTTP API接口功能。文中还提供了MySQL测试数据表的创建脚本和示例数据。

甘蓝的专栏 1156

【笔记4-26】安卓junit单元/集成测试(7-1更新)

一、可通过反射获取一个类的父类class : 方法:”使用Class类中的getSuperClass()方法能够得到一个类的父类“ 参考:https://www.cnblogs.com/kelelipeng/p/12010434.html 二、java 父类对象不能直接转化为子类对象: 参考:https://blog.youkuaiyun.com/u011630575/article/details/80072241 三、当一个xx类没有默认public的构造方法时,测试用例无法创建内部类来继承此xx类: .

qq_32675267的博客 581

Python爬虫实战:股票历史数据抓取与量化回测全流程详解

我们以**东方财富网(eastmoney.com)和雪球网(xueqiu.com)**为主要目标,演示如何爬取A股历史行情。最常用的HTTP请求库,简单易用,适合静态页面数据请求。本文详细介绍了从股票历史数据抓取到简单回测的完整流程,代码示例基于最新技术,结构清晰,适合初学者和进阶者学习量化投资实战。希望对你入门Python爬虫和量化交易有所帮助!

2201_76125261的博客 1778

JUnit4 / JUnit 5 全面详解【单元测试、Maven】

JUnit4 / JUnit 5 全面详解【单元测试、Maven】

青年有志 1万+

天气预测模型:基于时间序列分析的数学建模与实战案例

目录引言时间序列分析介绍使用Matlab进行天气预测实战案例:天气预测结论天气预测一直是气象学和相关领域的重要研究问题之一。数学建模是进行天气预测的有效方法之一,其中时间序列分析是常用的技术。在本篇博客中,我们将介绍时间序列分析的基本原理,演示如何使用Matlab进行模型建立和预测,并通过一个实战案例来展示模型的应用和分析。时间序列分析是一种用于分析和预测时间序列数据的统计方法。天气数据通常具有时间依赖性和随机性,因此时间序列分析可以帮助我们了解天气的变化趋势和规律,并提供对未来天气的预测。时间序列分析通常

YOLO 1545

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JUnit介绍:单元测试

本文将简单介绍单元测试以及如何使用单元测试

weixin_47510148的博客 1938

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Junit单元测试

JUnit是用于编写可复用测试集的简单框架,是xUnit的一个子集。xUnit是一套基于测试驱动开发的测试框架,有PythonUnit、CppUnit、JUnit等。JUnit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(what)的功能。多数]ava的开发环境都已经集成了JUnit作为单元测试的工具,比如IDEA,Eclipse等等。

m0_63645231的博客 2135

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java IDEA JUnit 单元测试

JUnit是一个开源的 Java 单元测试框架,它使得组织和运行测试代码变得非常简单,利用JUnit可以轻松地编写和执行单元测试,并且可以清楚地看到哪些测试成功,哪些失败JUnit 还提供了生成测试报告的功能,报告不仅包含测试的成功率,还能统计被测试代码的覆盖率。通过进行单元测试,我们可以确保每个方法按照预期正确运行。如果我们修改了某个方法的代码,只需要确保相应的单元测试通过,就可以认为修改是正确的。此外,测试代码本身也可以作为示例代码,用于演示如何调用该方法。

笔记 7298

idea单元测试- Junit

是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。单元测试、集成测试、系统测试、验收测试。1). 单元测试介绍:对软件的基本组成单位进行测试,最小测试单位。目的:检验软件基本组成单位的正确性。测试人员:开发人员2). 集成测试介绍:将已分别通过测试的单元,按设计要求组合成系统或子系统,再进行的测试。目的:检查单元之间的协作是否正确。测试人员:开发人员3). 系统测试介绍:对已经集成好的软件系统进行彻底的测试。目的:验证软件系统的正确性、性能是否满足指定的要求。测试人员:测试人员。

m0_67824084的博客 2964

在Eclipse中使用JUnit进行单元测试

JUnit是什么? JUnit的官网给出的简介: JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks. 每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。JUn...

xyzhang的博客 4432

如何在Java中使用JUnit进行单元测试

如果你正在开发一个基于Web的Java应用,可以借助Chrome官网提供的开发者工具来监控和分析你的API请求、响应以及其他Web相关的任务。希望通过本文,你能够更加熟悉JUnit的使用方法,并在日常开发中灵活运用,提升开发效率。JUnit是一个开源的测试框架,用于编写和运行Java程序的单元测试。在JUnit的帮助下,开发人员可以快速地测试代码的正确性,减少错误,并提高开发效率。在这个测试类中,我们使用了@Test注解来标记一个测试方法,并使用assertEquals方法来验证加法的结果是否正确。

OKCRoss的博客 1897

java中Junit单元测试

Junit单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。Java里单元指一个类。 JUnit ,是一个开源的Java单元测试框架,是 Java的标准单元测试库,是非常重要第三方 Java 库,由 Kent Beck 和 Erich Gamma 开发。 Junit作为一个软件测试的工具,JUnit可以不破坏java原代码,使用方便,添加快捷,代

学习笔记 3万+

JUnit 单元测试(详解)

本文为JUnit单元测试相关知识,下边将对JUnit单元测试概念,JUnit安装与使用,编写和运行@Test单元测试方法,设置执行JUnit用例时支持控制台输入,定义test测试方法模板等进行详尽介绍~

共同学习,共同成长 1944

JUnit 单元测试

总之,JUnit 是 Java 中最流行的单元测试框架之一,它提供了一个简洁而强大的平台,用于编写和运行自动化测试。JUnit 的核心就是那几个测试方法注解:⨳ @Test是最基本的测试注解,用于独立的、简单的测试场景。可以使用各种参数源(如数组、CSV 文件、方法等)提供测试输入,适用于参数化测试场景。通过指定重复次数,测试方法会被多次执行。这在需要验证方法的幂等性或检查重复执行时的行为时非常有用。适合高级场景,通过扩展机制重复执行同一个测试方法,但每次在不同的上下文中运行。

2301_78976656的博客 1302

利用JUNIT进行单元测试

利用JUNIT进行单元测试杨恒贤(yanghx@neusoft.com) 1.  当进行单元测试时,我们应该利用回归测试方法。2.  Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。3.  Junit本质上是一套框架,即开发者制定了一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接

优美弧度 1899

Junit单元测试总结

超详细的Junit单元测试笔记总结

StarryForest的博客 1161
上一篇: Android apk打包过程
下一篇: Android的布局复用与优化
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值