草庐IT

Junit框架

two 倩 2023-11-27 原文

JUnit 是一个 Java 编程语言的单元测试框架。

环境配置

创建maven项目,导入Junit配置

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>

JUnit的一些注意事项

测试方法必须使用 @Test 修饰

测试方法必须使用 public void 进行修饰

一般使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候只需要将 test 目录下代码删除即可

测试代码的包应该和被测试代码包结构保持一致

测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖

测试类一般使用 Test 作为类名的后缀

测试方法使一般用 test 作为方法名的前缀

注解

  1. @Test:将一个普通方法修饰成一个测试方法 这个方法不能是静态方法

2、@BeforeClass: 会在所有的方法执行前执行 (只会执行一次,而且是第一个运行)被这个注解修饰的方法是static方法

3、@AfterClass:会在所有的方法执行之后执行(只会执行一次,而且是最后一个运行)被这个注解修饰的方法是static方法

4、@Before:会在每一个测试方法被运行前执行一次 这个方法不能是静态方法

5、@After:会在每一个测试方法运行后被执行一次 这个方法不能是静态方法

6、@Ignore:所修饰的测试方法会被测试运行器忽略 可修饰静态和非静态方法

其中,在高版本的junit(junit5)中 @BeforeClass和@AfterClass注解替换为了@BeforeAll和@AfterAll注解,@Before和@After注解替换为@BeforeEach和@AfterEach注解

断言

序号

方法和描述

1

void assertEquals(boolean expected, boolean actual)

检查两个变量或者等式是否相等

2

void assertTrue(boolean condition)

检查条件为真

3

void assertFalse(boolean condition)

检查条件为假

4

void assertNotNull(Object object)

检查对象不为空

5

void assertNull(Object object)

检查对象为空

6

void assertSame(Object expected, Object actual)

assertSame() 方法检查两个相关对象是否指向同一个对象

7

void assertNotSame(Object expected, Object actual)

assertNotSame() 方法检查两个相关对象是否不指向同一个对象

8

void assertArrayEquals(expectedArray, resultArray)

assertArrayEquals() 方法检查两个数组是否相等

Junit各种注解的执行顺序

public class demo1Test {
    @BeforeAll//注解的静态方法最先执行 且执行一次
    public static void print() {
        System.out.println("@BeforeAll注解执行");
    }

    @AfterAll//注解的静态方法最后执行 且执行一次
    public static void print1() {
        System.out.println("@AfterAll注解执行");

    }

    @BeforeEach//注解的方法 在其他方法执行前执行一次
    public void print2() {
        System.out.println("@BeforeEach注解执行");
    }

    @AfterEach
    public  void print3() {
        System.out.println("@AfterEach注解执行");
    }

    @Test
    public  void print4() {
        System.out.println("@Test注解执行");
    }
}

@order注解

控制方法的执行顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)  //引入方法排序 这个类的方法就可以使用Order注解进行排序,根据排序执行
public class OrderTest {
    @Test
    @Order(1)//第一个执行
    void print(){
        System.out.println("aaa");
    }
    @Test
    @Order(2)//第二个执行
    void print1(){
        System.out.println("bbb");
    }
    @Test
    @Order(3)//第三个执行
    void print2(){
        System.out.println("ccc");
    }
}

测试套件

在实际项目中,随着项目进度的开展,单元测试类会越来越多,可是直到现在我们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的。为了解决这个问题,JUnit 提供了一种批量运行测试类的方法,叫做测试套件。

  1. 创建一个空类作为测试套件的入口

  1. 使用@Suite注解修饰类,表示这个类是一个套件

  1. @SelectClasses注解选择加入套件的类

  1. 保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数

@Suite//表示这个类是一个套件
@SelectClasses({demo1Test.class,demoTest.class})
public class suiteTest {

}

运行这个类,可以同时执行选择的类

除了选择类之外,还可以选择包加入到套件中

使用@SelectPackages()注解的前提是:包里面的类要以Test结尾,所有方法都要加入@Test注解

参数化测试

参数化测试允许开发人员使用不同的值反复运行同一个测试。

  1. @ParameterizedTest注解 标识方法类型是参数化

  1. @ValueSource注解 标识参数来源 其中的类型有int,byte,String,short,long,char等

  1. @ValueSource注解是设置单参数的,使用@CsvSource注解设置多参数,默认分割参数是逗号,delimiterString参数可以设置分隔符

  @org.junit.jupiter.params.ParameterizedTest
    @CsvSource(value = {"张三-10","李四-19"},delimiterString = "-") //设置分隔符是-
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }
  1. 如果参数内容过多,可以使用文件保存传入数据

使用@CsvFileSource()注解

  1. 在当前项目的resources文件夹下创建.csv文件

  1. 在@CsvFileSource注解中设置文件路径

  @org.junit.jupiter.params.ParameterizedTest
    @CsvFileSource(resources = "/my.csv",delimiterString = "-")
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }
  1. 如果不是resources文件夹下的文件,就不使用resources参数设置,要使用files参数设置

 @org.junit.jupiter.params.ParameterizedTest
    @CsvFileSource(files = "C:\\Users\\30283\\Desktop\\demo.csv",delimiterString = "-")
    public void setNameAndAge(String name, int age) {
        System.out.println(name + age);
    }

动态参数

方法的参数是不固定的,如果参数是由另外一个方法返回,就要使用@MethodSource(方法名)注解

提供动态参数的方法必须能够生成一个由参数集组成的流。这里所说的“流”是指所有可以被JUnit转换为Stream类型的任何类型,如Stream, DoubleStream, LongStream, IntStream, Collection, Iterator, Iterable,对象数组,原始类型数组等等。流中的元素也可以作为Arguments类的实例、对象数组、单个值(如果参数化测试方法只接受单个参数)等提供给参数化测试方法。

1、处理单参数

//这个方法提供传入的参数 返回的结果可以是Stream流
    private static Stream<String> get() {
        return Stream.of("张三","李四","王五");
    }

    @org.junit.jupiter.params.ParameterizedTest
    @MethodSource("get") //get方法返回的结果 将作为print的参数传入
    public void print(String  num){
        System.out.println(num);
    }

2、处理多参数

这是 提供参数的方法必须返回以Arguments类型的对象为元素的流

 //这个方法提供传入的参数 返回的结果可以是Stream流  arguments对象存储的是实际 传递给函数的参数,
    private static Stream<Arguments>  get() {
        return Stream.of(Arguments.arguments("张三",13), Arguments.arguments("李四",10));
    }

    @org.junit.jupiter.params.ParameterizedTest
    @MethodSource(value = {"get"}) //get方法返回的结果 将作为print的参数传入
    public void print(String num,int age){
        System.out.println(num+age);
    }

有关Junit框架的更多相关文章

  1. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  2. ruby - sinatra 框架的 MVC 模式 - 2

    我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho

  3. ruby-on-rails - 正确了解 Rails 框架的最佳方式是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在Rails上做两个项目,它们运行良好,但在这个过程中重新发明了轮子,自来水(和热水)和止痛药,正如我随后了解到的那样,这些已经存在于框架中。那么基本上,正确了解框架中所有智能部分的最佳方法是什么,这将节省时间而不是自己构建已经实现的功能?从第1页开始阅读文档?是否有公开所有内容的特定示例应用程序?一个特定的开源项目?所有的rails交通?还是完全

  4. ruby - 自动将院子文档框架添加到现有的 Rails 遗留代码中 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭4年前。Improvethisquestion我希望能够将模板化的YARD文档样式注释插入到我现有的Rails遗留应用程序中。目前它的评论很少。我想要具有指定参数的类header和方法header(通过从我假定的方法签名中提取)和返回值的占位符。在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入到代码中的文档header注释。在带有Ducktyping等的Ruby中,我确信诸如@params等类型之类

  5. ruby-on-rails - 具有六边形架构和 DCI 模式的框架和数据库适配器 - 2

    我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有

  6. python - Ruby 是否有相当于 Python 的扭曲框架作为网络抽象层? - 2

    据我了解,Python的扭曲框架为网络通信提供了更高级别的抽象(?)。我正在寻找在Rails应用程序中使用与twisted等效的Ruby。 最佳答案 看看EventMachine.它不像Twisted那样广泛,但它是围绕事件驱动网络编程的相同概念构建的。 关于python-Ruby是否有相当于Python的扭曲框架作为网络抽象层?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/9

  7. ruby-on-rails - 使用 Rails 以外的 Ruby 框架是否有任何潜在的缺点? - 2

    我想使用比Rails(Sinatra/Ramaze/Camping)更轻的框架,但我担心这样做我将无法使用许多以插件形式为Rails定制的共享库.这是一个主要问题,还是这些插件中的大多数都可以跨不同的Ruby框架使用?使用Ruby框架而不是Rails是否还有其他潜在的缺点? 最佳答案 您仍然可以使用gems在你提到的所有框架中,很多东西都是可重用的。想要交换一个新的ORM,没问题。想要一个花哨的shmacy语法高亮,没问题。Rails一直在大力插入摆脱旧的插件模型,转而使用gems。如果其他框架之一符合您的需求,最好使用它。请记住,

  8. ruby - 应该 validate_format_of 。 not_with 在框架中有问题(或者在我的理解中) - 2

    我将以下代码放入RSpec测试中:it{shouldvalidate_format_of(:email).not_with('test@test')}并设置实际的类:validates:email,:presence=>true,:format=>/\b[A-Z0-9._%-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b/i当我运行测试时,我得到:失败:1)用户失败/错误:它{应该validate_format_of(:email).not_with('test@test')}当电子邮件设置为“test@test”时,预期错误包括“can'tbeblank”,得到错误

  9. ruby-on-rails - Rails 使用了哪些测试框架? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。ImprovethisquestionRails使用了哪些单元测试框架?我正在阅读一本书(PragmaticProgrammersAgileDev.withRails),其中展示了如何在Rails中进行单元测试。这本书向我展示了默认的Rails测试套件(Test::Unit的子类)。这是Rails社区中使用的主要测试框架吗?我在执行常规ruby​​时使用RSpec,我也希望能够在Rails中使用它(如果不是太麻烦的话)?

  10. ruby - rspec模拟与其他模拟框架的优缺点是什么? - 2

    我看过很多过时的播客,其中提到摩卡是我想安装的一个宝石,因为它确实比rspec更好模仿。我有一种感觉,rspec开发人员已经意识到这一点,并从那时起改进了他们的模拟。但是,在默认的spec_helper.rb文件中,我看到三个模拟框架的一些注释掉的代码存根mochaflexmockrr向任何能给我一个像样答案的人投赞成票,就这些框架中至少一个的利弊与rspec自己的模仿框架进行比较。如果你能给我一个关于这三个问题的详细说明,我会接受你的回答。 最佳答案 真的,这只是口味的问题。看一看语法,看看什么最适合你。当然,使用rspec的内置

随机推荐