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

htrmnn0y  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(99)

我希望提供任何新的基于java的项目,将基本/通用smoke testing作为github-actions或ansible上的CICD管道的一部分。
与其让开发人员为他们的应用程序编写烟雾测试用例,我希望为他们提供由工具或插件自动生成的默认测试用例。
我记得的一个插件是diffblue
它也有github CICD集成示例步骤。
我在使用它的CLI(免费许可证)时遇到了一些挑战,它提供的正是我希望探索其他选项的原因。
我的repo结构是:

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.commonsrc.test.java文件夹中的日志抛出任何错误。
    不知道我试图将cli用于单个java文件或整个java repo项目时出了什么问题。
    1.我希望探索可能提供更多服务或更受欢迎的替代工具。
    注意:此项目是使用ant build.xml构建的
    请建议。
rqdpfwrv

rqdpfwrv1#

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

**注意:**DiffBlue不支持基于Ant的项目。

因此,考虑将基于Ant的代码库迁移到基于Maven的代码库以使用DiffBlue工具。
Official DiffBlue Documentation

前提条件

1.目前支持Java 8 Update 351+Java 11.0.17+Java 17.0.5+
1.仅支持Maven 3.2.5+Gradle 4.9+构建工具。
1.任何项目(用于Diffblue Cover)都必须在没有失败的单元测试的情况下编译和运行。支持
JUnit
TestNG测试框架。
DiffBlue如何与Maven一起工作的示例:

**注意:**我使用Mac来展示它是如何工作的。这个过程对于Windows来说也是类似的。

1.阅读here的文档以设置DiffBlue CLI。
1.执行dcover version以验证是否安装了DiffBlue。

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

我有一个基于spring-boot的maven root项目,结构如下。

.
├── 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.我有一个带有端点divide的SampleController类,它会抛出ArithmeticException:

@RestController
public class SampleController {

   @GetMapping("divide")
   public int divideByZero() throws ArithmeticException {
      int number = 2;
      return number / 0;
  }
}

1.使用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()).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:                                               2 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语言)。

更新:我找到了一个工具,名为TackleTest-Unit,可以生成基于Java的单元测试用例。这个工具最主要的是支持Ant
Github仓库:https://github.com/konveyor/tackle-test-generator-cli

来自README.md

TackleTest-Unit自动生成Java应用的单元测试用例。每个生成的测试用例都关注于应用程序类的可见方法的执行。测试生成可以在一组特定的应用程序类或整个应用程序上完成。

在其众多功能中,TackleTest-Unit:

  • 支持自动生成测试Assert:可以生成带有或不带有Assert的测试
  • 结合不同的覆盖指标并生成覆盖报告:支持的覆盖度量包括常规的代码覆盖标准,如语句和分支覆盖,以及一种新颖的基于类型的Java方法的组合覆盖
  • 支持开发人员编写的单元测试套件:它可以执行覆盖率驱动的扩充和定向测试生成,以增强给定测试套件所达到的覆盖率
  • 支持多种构建工具:MavenGradleAnt
    阅读文档了解更多信息,该工具看起来很有前途。你可以试试看

相关问题