如何使用命令行为Java应用程序生成冒烟测试用例

问题描述 投票:0回答:1

我希望提供任何新的基于 java 的项目,将基本/通用

smoke testing
作为 github-actions 或 ansible 上 CICD 管道的一部分。

我希望为他们提供由工具或插件自动生成的默认测试用例,而不是让开发人员为其应用程序编写冒烟测试用例。

我记得的一个这样的插件是 diffblue

它还有 github CICD 集成示例步骤。

我在使用其 CLI(免费许可证)时遇到了一些挑战,而它提供的功能正是我希望探索其他选项的原因。

我的回购结构是:

myrepo
  |--src
      |--classes
            |--common
                 |--com
                     |--mybank
                          |--common
                               |--hello1.class
                               |--hello2.class
                               |--util
                                    |--hello3.class

我尝试生成测试用例 java 文件,该文件应根据文档生成于

myrepo
  |--src
      |--test
            |--java
                                                     
  1. dcover -classpath "D:\maven\bin\mvn.bat" com.mybank.common.hello1
    不会生成任何测试用例 java 文件,不会根据
    com.mybank.common
    src.test.java
    文件夹中的日志抛出任何错误。

不确定我尝试对单个 java 文件或整个 java repo 项目使用 cli 时出了什么问题。

  1. 我希望探索可能提供更多服务或更受欢迎的替代工具。

注意:该项目是使用

ant
build.xml

构建的

请推荐。

java maven command-line-interface cicd smoke-testing
1个回答
0
投票

首先,你的repo代码不是Maven项目。为了使独立的 Maven 批处理文件正常工作,您的项目需要完全是包含 pom.xml.

的 Maven 项目

注意: DiffBlue 不适用于基于 Ant 的项目。

来自官方 DiffBlue 文档

先决条件

    目前支持
  1. Java 8 Update 351+Java 11.0.17+Java 17.0.5+

  2. 仅支持Maven 3.2.5+Gradle 4.9+构建工具。

  3. 任何项目(与 Diffblue Cover 一起使用)都必须在没有失败的单元测试的情况下编译和运行。支持JUnitTestNG测试框架。

DiffBlue 如何与 Maven 配合使用的示例:

注意:我使用 mac 来展示它是如何工作的。 Windows 的过程也是相同的。

  1. 此处阅读文档以设置 DiffBlue CLI。

  2. 执行

    dcover version
    来验证是否安装了DiffBlue。

    ➜  demo git:(master) ✗ dcover version
       2023.09.01-9200f07-licensed 
    

我有一个基于 spring-boot 的 Maven 根项目,其结构如下。

.
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               ├── SampleController.java
│   │   │              
│   │   │               
│   │   │               
│   │   │  
│   │   │               
│   │   └── resources
│   │       ├── application.yml
│   │       ├── static
│   │       └── templates
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── demo
                        └── empty <no test classes>
  1. 我有一个 SampleController 类,但有一个例外:

    @RestController
    public class SampleController {
    
       @GetMapping("divide")
       public @ResponseBody int divideByZero() throws ArithmeticException {
          int number = 2;
          return number / 0;
      }
    }
    
  2. 使用

    cd
    命令进入根项目目录。

注意: 从根目录本身执行命令,因为 DiffBlue 足够智能,可以读取所有类和包。

  1. 生成测试的命令如下:

    dcover create full-qualified-package-name.ClassName
    

示例:

dcover create com.example.demo.SampleController

当前项目结构包含执行 dcover 后的测试类:

.
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── demo
│   │   │               ├── SampleController.java
│   │   │              
│   │   │               
│   │   │               
│   │   │  
│   │   │               
│   │   └── resources
│   │       ├── application.yml
│   │       ├── static
│   │       └── templates
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── demo
                        └── SampleControllerDiffblueTest.java
  1. 上面代码生成的测试类如下:

      package com.example.demo;
    
      import static org.junit.jupiter.api.Assertions.assertThrows;
      import static org.mockito.Mockito.mock;
      import org.junit.jupiter.api.Test;
    
      class SampleControllerDiffblueTest {
         /**
          * Method under test: {@link SampleController#divideByZero()}
          */
          @Test
          void testDivideByZero() {
           assertThrows(ArithmeticException.class, () -> (new SampleController(mock(MyService.class))).divideByZero());
         }
      }
    

控制台日志:

INFO  Diffblue Cover 2023.09.01-9200f07-licensed
INFO
INFO  Detecting environment:
INFO  ----------------------
INFO  Detected Java version 17.0.8
INFO  Selected build system: Maven
INFO  Selected classpath from build system Maven
INFO  Selected test framework: JUnit Jupiter
INFO  Selected Java language compliance level: 17
INFO  Selected test validation: enabled
INFO  Prefixes for filtering classes/methods:
INFO  - com.example.demo.SampleController
INFO  Gathering methods to test...
........
INFO
INFO  Creating tests:
INFO  ---------------
INFO  [1/1] com.example.demo.SampleController
INFO  [1/1]   Tests created: 1
INFO
INFO  Summary:
INFO  --------
INFO  Total:                                               3 methods
INFO  1 test created for:                                  1 method
INFO
INFO  Tested indirectly via other methods:                 1 method
INFO      1 T005: Trivial constructor
INFO
INFO  Running validation command.
INFO  This can take a couple of minutes.........
INFO  1 created test was successfully validated.
INFO  Log file: /Users/anish/Downloads/demo/.diffblue/log/user-20230922T200532.log

INFO  Finished in 2m 12s

此外,您还可以尝试其他工具,例如 Cucumber Framework,这是一个优秀的框架,用于通过 .feature 文件以人类理解的语法编写测试类,并且能够基于 .feature 文件生成测试类(它使用 Gherkin 语言) ).

© www.soinside.com 2019 - 2024. All rights reserved.