Diffblue Cover AI Java:Difflane如何利用Diffblue Cover AI实现Java自动化的单元测试(Diffblue Cover快速入门)(1)

avatar
作者
猴君
阅读量:4

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

您的项目配置(例如,pom.xml对于Maven项目)必须包括所有必需的依赖项,并且它们都必须已经构建或下载(例如,通过mvn clean install对Maven项目进行构建)。

JUnit始终是必需的依赖项。

在这里插入图片描述

如果它们是您项目的可传递依赖项,则可能需要下面列出的依赖项。

如果这些依赖关系中的一种是必需的,但是缺少,则会为某些类生成测试,而不会为其他类生成测试。

一条消息将出现在事件日志中,指示缺少依赖项。

在这里插入图片描述

请注意,您只能在一个项目上运行Cover IntelliJ插件的一个实例。不支持在同一项目上运行多个实例。

4、安装Cover IntelliJ插件

如果您不是直接从JetBrains市场安装,则将zip文件下载到合适的位置。

从IntelliJ IntelliJ IDEA -> Preferences(macOS)或File -> Settings(Windows / Linux)菜单中选择Plugins项目。

单击Installed窗口顶部选项卡右边的齿轮图标。从下拉菜单中选择Install Plugin from Disk…

导航到插件的位置,选择zip文件,然后单击Open。点击OK。

在这里插入图片描述

当提示您这样做时,请单击到Restart IDE,然后单击确定OK。

5、汇入 CoreBanking

该CoreBanking应用程序是一个用于演示目的的简单银行应用程序,可以在https://github.com/diffblue/CoreBanking中找到。

在不加载项目的情况下启动IntelliJ以查看欢迎屏幕:

在这里插入图片描述

选择Get from Version Control选项。选择Git从版本控制下拉框。CoreBanking在存储库框中输入url,为项目选择合适的位置。然后,单击Clone。

在这里插入图片描述

使用Al, Diffblue可以以人 类可读的形式自动编写Java单元测试,覆盖率高达80%,随着代码的发展,即使在具有数百万行代码的应用程序上,它们也可以自动维护测试。

6、编写新测试

为了为当前未涵盖的类生成新的测试:

选择Project窗口。

选择CoreBanking-> src-> main-> java-> io.diffblue.corebanking-> account-> Account

右键单击并Write Tests从菜单中选择选项。

成功克隆后,展开下面的CoreBanking部分Project以查看源树。

在这里插入图片描述

该插件在分析代码和创建测试之前先构建项目。生成项目后,单击屏幕底部的进度栏以打开一个弹出窗口。

进度窗口将显示分析所经历的不同阶段。在分析代码时,可以查看当前进度,但是在较小的项目(例如)中CoreBanking,这是一个非常短的时间范围。

创建新测试后,它们将被自动集成到项目中src/test/java。

请注意,也可以Write Tests通过右键单击以下内容:

源代码编辑器中的各个类

源代码编辑器中的各个方法

源文件顶部的选项卡中的各个类 Project菜单中其类内的各个方法(如果Show Members右键单击Project菜单后已选择)

在IDE的其他地方(例如在测试类或非Java文件中),该Write Tests功能被禁用。

7、运行测试

在Diffblue Cover为您的项目编写测试之后,它们将自动集成到您的测试套件中。Diffblue Cover创建的测试使用JUnit测试框架,因此junit包含在的CoreBanking项目依赖项中pom.xml。

在项目浏览器中,从CoreBanking-> src-> test-> java-> io.diffblue.corebanking-> ->中选择新类AccountTest,然后右键单击并选择Run 'AccountTest'

在这里插入图片描述

然后将显示JUnit运行的结果:

在这里插入图片描述

四、封面示例测试

在本文中,我们将显示输入源和Cover生成的各种复杂性代码的测试,并附有详细的叙述,以帮助您进一步了解Cover生成的测试。

1、基本断言

这是一个带有简单getter的Spring Service源代码的简单示例。DCover可以通过内联写一个春天开机测试的服务提供商,吸气Arrange,Act和Assert。

1.1、来源

import org.springframework.stereotype.Service;

@Service

public class SimpleService

{

public String getValue() {

return “a really simple service”;

}

}

1.2、 Diffblue Cover产生的测试

@SpringBootTest

@RunWith(org.springframework.test.context.junit4.SpringRunner.class)

public class SimpleServiceDiffblueTest {

@Autowired

private SimpleService simpleService;

@Test

public void testGetValue() {

// Arrange, Act and Assert

assertEquals(“a really simple service”, this.simpleService.getValue());

}

}

2、模拟

此类包含两个方法,用于从Amazon S3存储桶上传文件和从Amazon S3存储桶下载文件。由于Amazon S3存储桶是一种云存储机制,因此此类/方法的测试需要依赖项注入。downloadFileFromBucket通过声明所需的S3Object和使用该方法下载的S3Object,DCover可以模拟这些类型的依赖关系并测试方法。

2.1、来源

@Service

public class AmazonService {

@Autowired

private AmazonS3 s3client;

public PutObjectResult uploadFileToBucket(String bucketName, String key, File file) {

return s3client.putObject(bucketName, key, file);

}

public S3Object downloadFileFromBucket(String bucketName, String key) {

return s3client.getObject(bucketName, key);

}

}

2.2 、Diffblue Cover生成的测试

@SpringBootTest

public class AmazonServiceDiffblueTest {

@MockBean

private AmazonS3Client amazonS3Client;

@Autowired

private AmazonService amazonService;

@Test

public void testUploadFileToBucket() {

// Arrange

PutObjectResult putObjectResult = new PutObjectResult();

putObjectResult.setContentMd5(“file-hash”);

when(this.amazonS3Client.putObject(or(isA(String.class), isNull()), or(isA(String.class), isNull()),

or(isA(File.class), isNull()))).thenReturn(putObjectResult);

// Act and Assert

assertSame(putObjectResult, this.amazonService.uploadFileToBucket(“foo”, “foo”,

Paths.get(System.getProperty(“java.io.tmpdir”), “test.txt”).toFile()));

}

@Test

public void testDownloadFileFromBucket() throws UnsupportedEncodingException {

// Arrange

StringInputStream objectContent = new StringInputStream(“file-name”);

S3Object s3Object = new S3Object();

s3Object.setObjectContent(objectContent);

when(this.amazonS3Client.getObject(or(isA(String.class), isNull()), or(isA(String.class), isNull())))

.thenReturn(s3Object);

// Act and Assert

assertSame(s3Object, this.amazonService.downloadFileFromBucket(“foo”, “foo”));

}

}

3、与操作系统无关的断言

本示例以其他格式返回时间。DCover编写一个测试以声明不依赖于操作系统或本地时区的日期和时间。

3.1、来源

public class TimeInAliceWonderland {

private static final String DODO_DATETIME_FORMAT = “ss:mm:HH dd-MMM-yyyy”;

public static String reformatDodoDateTime(Date humanDate) {

Map<String, DateFormat> dateFormatMap = new HashMap<>();

dateFormatMap.put(DODO_DATETIME_FORMAT, new SimpleDateFormat(DODO_DATETIME_FORMAT));

return dateFormatMap.get(DODO_DATETIME_FORMAT).format(humanDate);

}

}

3.2、 Diffblue Cover产生的测试

@Test

public void testReformatDodoDateTime() {

LocalDateTime atStartOfDayResult = LocalDate.of(1970, 1, 1).atStartOfDay();

assertEquals(“00:00:00 01-Jan-1970”, TimeInAliceWonderland

.reformatDodoDateTime(

Date.from(atStartOfDayResult.atZone(ZoneId.systemDefault()).toInstant())));

}

4、包含逻辑的例子

在此示例中,DCover编写了两个测试以覆盖通过条件的每个路径-一个将余额加10并断言新余额应为20的测试,以及另一个关闭帐户的测试。

4.1、资料来源

public class Account {

private final long accountNumber;

private final Client client;

private long currentBalance;

private String accountName;

private AccountState accountState;

public Account(final long accountNumber, final Client client, final long amount) {

this.accountNumber = accountNumber;

this.client = client;

currentBalance = amount;

accountName = “Current”;

accountState = AccountState.OPEN;

}

public long getCurrentBalance() {

return currentBalance;

}

public void addToBalance(final long amount) throws AccountException {

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
e = amount;

accountName = “Current”;

accountState = AccountState.OPEN;

}

public long getCurrentBalance() {

return currentBalance;

}

public void addToBalance(final long amount) throws AccountException {

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-3TTYJGlP-1713297047626)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!