我希望提供任何新的基于 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
dcover -classpath "D:\maven\bin\mvn.bat" com.mybank.common.hello1
不会生成任何测试用例 java 文件,不会根据 com.mybank.common
或 src.test.java
文件夹中的日志抛出任何错误。不确定我尝试对单个 java 文件或整个 java repo 项目使用 cli 时出了什么问题。
注意:该项目是使用
ant
build.xml 构建的
请推荐。
首先,你的repo代码不是Maven项目。为了使独立的 Maven 批处理文件正常工作,您的项目需要完全是包含 pom.xml.
的 Maven 项目注意: DiffBlue 不适用于基于 Ant 的项目。
先决条件:
Java 8 Update 351+、Java 11.0.17+ 或 Java 17.0.5+。
仅支持Maven 3.2.5+或Gradle 4.9+构建工具。
任何项目(与 Diffblue Cover 一起使用)都必须在没有失败的单元测试的情况下编译和运行。支持JUnit和TestNG测试框架。
DiffBlue 如何与 Maven 配合使用的示例:
注意:我使用 mac 来展示它是如何工作的。 Windows 的过程也是相同的。
从此处阅读文档以设置 DiffBlue CLI。
执行
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>
我有一个 SampleController 类,但有一个例外:
@RestController
public class SampleController {
@GetMapping("divide")
public @ResponseBody int divideByZero() throws ArithmeticException {
int number = 2;
return number / 0;
}
}
使用
cd
命令进入根项目目录。
注意: 从根目录本身执行命令,因为 DiffBlue 足够智能,可以读取所有类和包。
生成测试的命令如下:
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
上面代码生成的测试类如下:
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 语言) ).