AI 辅助测试(MEAP)(一)(4)

简介: AI 辅助测试(MEAP)(一)

AI 辅助测试(MEAP)(一)(3)https://developer.aliyun.com/article/1516294

4.2.2 分析代码

就像我们可以促使一个 LLM 分析书面的想法一样,我们也可以让它审查代码,并帮助我们识别风险。使用这个提示类似于模拟与你合作的开发人员或测试人员的角色,让他们在你开发时分析你的工作并提出建议供考虑。让我们看看一个可能对这种类型的活动有用的提示:

#A
You are a software testing expert. Analyze the code delimited by triple hashes and identify risks that might impact the code. If no code is provided, respond with "No risks could be found"
#B
* Risks must be related to the quality characteristics: Performance, security and interoperability
* Multiple risks can be identified for each quality characteristic
* Output identified risks in the format of Risk - Quality Characteristic - Explanation
#C
Example:
Overflow - Security - Adding in large integers as parameters might cause the method to trigger a buffer overflow.
#D
###
public BookingResult createBooking(Booking bookingToCreate) throws SQLException {
    if(dateCheckValidator.isValid(bookingToCreate.getBookingDates())) {
        if (bookingDB.checkForBookingConflict(bookingToCreate)) {
            return new BookingResult(HttpStatus.CONFLICT);
        } else {
            CreatedBooking createdBooking = bookingDB.create(bookingToCreate);
            if(bookingToCreate.getEmail() != null && bookingToCreate.getPhone() != null){
                MessageBuilder messageBuilder = new MessageBuilder();
                Message message = messageBuilder.build(bookingToCreate);
                messageRequests.postMessage(message);
            }
            return new BookingResult(createdBooking, HttpStatus.CREATED);
        }
    } else {
        return new BookingResult(HttpStatus.CONFLICT);
    }
}
###

在我向 ChatGPT 发送了包含示例代码和质量特征的提示后,返回了以下输出:

Based on the provided code snippet, let's analyze the potential risks that might impact the quality characteristics of Performance, Security, and Interoperability:
    Performance - Nested Validation:
    Risk: The nested validation checks (dateCheckValidator.isValid and bookingDB.checkForBookingConflict) may lead to performance issues, especially when dealing with a large number of bookings.
    Explanation: If the system has to process a substantial amount of bookings, the nested validation can result in increased execution time and resource consumption.
    Performance - Message Posting:
    Risk: The message posting (messageRequests.postMessage) might introduce performance bottlenecks, affecting the overall system responsiveness.
    Explanation: If the message posting process involves network communication or I/O operations, it could slow down the execution of the createBooking method.
    Security - SQL Injection:
    Risk: The code is susceptible to SQL injection attacks as it directly uses the bookingToCreate object in the database queries.
    Explanation: Malicious input in the bookingToCreate object could manipulate the SQL queries and compromise the integrity and security of the database.
    Security - Inadequate Authorization:
    Risk: The code does not perform explicit authorization checks before creating bookings, potentially allowing unauthorized users to create bookings.
    Explanation: Lack of proper authorization checks can lead to unauthorized access and misuse of the system's booking creation functionality.
    Interoperability - Platform Dependencies:
    Risk: The code might have dependencies on specific platforms or libraries, limiting its interoperability with other systems or environments.
    Explanation: If the MessageBuilder or messageRequests rely on platform-specific features or external libraries, it could cause issues when running the code in different environments.
    Interoperability - Error Codes:
    Risk: The code returns HTTP status codes directly, which may not be compatible with other systems that expect different error code formats.
    Explanation: If external systems expect error codes in a different format (e.g., JSON or XML), using HTTP status codes may hinder interoperability.

与前一个提示类似,它围绕书面需求产生了问题,这些不同风险的质量也不同。例如,风险Performance - Message Posting感觉相当抽象,正如我们在其解释中看到的那样:

If the message posting process involves network communication or I/O operations, it could slow down the execution of the createBooking method.

围绕网络通信或 I/O 操作提出风险建议感觉模糊,因为它可能涉及一系列实现,其中一些可能与我们的工作有关,而另一些可能不相关。

然而,其他风险更具体,可能更有用,例如,Security - Inadequate Authorization,其中它强调了:

The code does not perform explicit authorization checks before creating bookings, potentially allowing unauthorized users to create bookings.

这个风险感觉更具体,因为它涉及到我们方法中执行的操作,以及其中缺少的可能重要的检查。当然,我们可能会在其他地方进行授权检查,但使用它所提供的信息,它强调了一个明确的活动,我们可能需要进一步讨论以改进我们的预订功能的安全性。

生成更多的想法

到目前为止,我们已经查看了发送给 LLM 的单个提示,这使我们有用的反馈进行了审查。但是如果我们想要索取更多的问题和风险怎么办?我们只需提交额外的提示,例如“生成更多问题”或“识别更多风险”。但要小心,因为这会有递减的回报。LLM 将尝试满足我们的要求,从而增加幻觉的风险。因此,随着选项开始枯竭,我们可能会看到更多与我们最初希望反馈的想法和代码不相关的建议。

4.2.3 认识到模拟总比什么都没有好

当讨论测试时,重点通常集中在测试用例的制作和执行上。但是,一个经过高度培训和经验丰富的测试人员通过使用其批判性和横向思维技能提供价值,并提出有助于我们以新的方式查看解决方案并揭示潜在问题的问题。我们看过的提示可以提供该过程的模拟。但重要的是要记住,LLMs 没有这些批判性和横向思维技能,而生成的问题和风险来自我们提示的指示。相反,这些类型的提示可以提供一种轻量级的方式来模拟与测试人员或其他开发人员配对的经验,当无法配对时。关键是培养一种识别生成问题的眼光,以确定哪些是有用的,哪些是没有用的。

4.3 利用 AI 辅助构建质量

到目前为止,我们已经将提示视为单一活动,但现在让我们将注意力转向我们最近学到的提示以及其他 LLM 辅助工具如何与 TDD 结合使用,帮助我们构建质量。

尽管 TDD 与其他测试活动相比并不严格是一种测试活动,但正确执行的 TDD 可以帮助开发人员将质量融入我们的产品中。简而言之,TDD 的过程是使用单元检查工具首先创建失败的检查,然后创建足够的生产代码使检查通过(并修复可能失败的任何其他检查)。一旦我们的所有检查都通过了,我们可以在确保所有检查都是绿色的同时重构我们的生产代码。完成后,我们重新开始循环,直到工作完成,如图 4.1 所示。

图 4.1 红绿重构 TDD 循环

所有这些检查是什么意思?

在我们的测试自动化培训中,Richard Bradshaw 和我区分了人工测试和工具测试。我们称后者为自动化检查,因为工具只能断言我们编码到自动化中的显式操作或数据。这种区别帮助我们更好地理解,像单元检查框架这样的自动化工具非常擅长快速检查产品中的小型、具体的变化,但不能告诉我们有关系统的更多信息。然而,人类在测试中更慢且不确定性更大,尽管我们在识别同时发生的许多事件时效率更高。因此,这就是为什么工具检查而人类测试。一个并不比另一个更好,希望这本书能证明当我们结合两者时,我们能取得最好的成功。

这种方法使我们能够设计出高度可测试的产品,同时确保我们提供了业务或最终用户所期望的内容。

尽管它的好处多多,但一些开发人员发现很难采用 TDD 方法,因为有些人认为它会减慢开发速度,因为我们为系统中添加的每个特定的生产代码部分创建单元检查。然而,通过使用像 Copilot 这样的工具,我们可以学会如何建立一个平衡,在这个平衡中,工具使我们能够快速创建单元检查并构建质量。

4.4 使用 LLMs 创建我们的第一个 TDD 循环

为了演示,让我们来完成为示例工时管理器的一部分功能的过程,该功能如下所述:

As a timesheet user
I want to be able to track time against specific projects
So that I can keep a history of how much time I have spent working on individual projects
Features:
- Time is tracked in half hour units
- To complete a timesheet a project and amount of time must be entered
- I should only be able to see my tracked time

您可以在以下 GitHub 存储库中查看作为示例一部分创建的测试和生产代码:github.com/mwinteringham/ai-assisted-testing/tree/main/chapter-4

设置 Copilot

这一章假设您已经在您的集成开发环境中安装并配置了 Copilot 插件。如果您尚未完成设置过程,您可以在附录中找到安装说明。

4.4.1 准备工作

在开始创建我的工时管理器功能之前,我想先考虑一下如何构建它。为了帮助我进行这个过程,并鼓励我从各个角度考虑解决方案,我将本章前面探索的第一个提示输入到其中。具体来说,我:

  • 将质量特性更改为准确性和一致性
  • 将用户故事添加到提示底部的分隔部分中
You are a software testing expert. Analyze the text delimited by triple hashes and generate questions that will clarify ambiguities in the text.
* Questions will be generated by using the What, Where, Why, When, Who and How heuristic
* Multiple questions can be identified for each quality characteristic
* The quality characteristics we care about are: Accuracy and Consistency
* Output questions in the format of Question - Explanation
Example:
What does relevant mean?
The acceptance criteria says relevant search results, but how do we determine what is relevant and what isn't?
###
As a timesheet user
I want to be able to track time against specific projects
So that I can keep a history of how much time I have spent working on individual projects
Features:
- Time is tracked in half hour units
- To complete a timesheet a project and amount of time must be entered
- I should only be able to see my tracked time
###

将此提示发送给 ChatGPT 返回了以下响应:

Accuracy:
    What is the required precision for tracking time in half-hour units? - The text mentions that time is tracked in half-hour units. It's important to know the level of accuracy required for this tracking.
    How will the system handle invalid time entries? - Since time must be entered to complete a timesheet, what measures are in place to ensure that only valid time entries are accepted?
    What validation mechanisms are in place to prevent users from entering incorrect time data? - To maintain accuracy, it's essential to know how the system will validate and handle potential data entry errors.
    How will the system handle time zone differences for users in different locations? - This is important to ensure that the tracked time is consistent and accurate for users in various time zones.
Consistency:
    Where will the history of tracked time be stored and accessed? - To ensure consistency, it's important to know where the data will be stored and how users can access it.
    What are the rules for displaying and formatting tracked time information? - Consistency in displaying the tracked time across the system is crucial for a seamless user experience.
    Who is responsible for verifying and maintaining the consistency of tracked time data? - It's essential to assign responsibility for data integrity and consistency to avoid discrepancies.
    When and how often will the timesheet data be synchronized or updated? - Ensuring consistency in real-time updates or scheduled syncs is vital to avoid discrepancies between users' data.
    How will the system handle potential conflicts if multiple users try to update the same project's timesheet simultaneously? - Maintaining consistency in data updates when multiple users are involved is critical to prevent data loss or inaccuracies.
    What security measures are in place to protect the data and ensure its integrity? - Consistency also involves safeguarding the data from unauthorized access or tampering.
什么是质量特性?

质量对不同的人意味着完全不同的事情,是一个多方面的概念。因此,当试图理解质量对利益相关者或最终用户意味着什么时,我们将其思考方式分解成不同的特征。例如,质量特征可能包括外观和感觉、可用性、合规性等等。不同的项目将有不同的质量特征,我们要优先考虑哪些质量特征是我们和我们的用户的重点,这取决于我们作为团队的选择。

从这里开始,我阅读了每个发送给我的问题,并注意到那些引起我注意的问题,因为它们提出了我没有考虑过的观点:

How will the system handle invalid time entries? / What validation mechanisms are in place to prevent users from entering incorrect time data?

对我来说,这两者感觉非常相似,但它们强调了在某个时候,我需要将日期时间处理加入代码中,以防止无效输入引起的问题。

How will the system handle time zone differences for users in different locations?

这是一个很好的问题,但与这项工作无关,因为我打算只跟踪执行的时间,而不是执行的时间点(至少目前是这样)。

What are the rules for displaying and formatting tracked time information?

与前一个问题相关联,我选择简单地跟踪经过的时间,而不是具体时间点——这意味着信息的显示相对简单。

How will the system handle potential conflicts if multiple users try to update the same project's timesheet simultaneously?

目前还没有多用户功能,尽管它可能稍后会被引入,所以我做个记录,以便未来的迭代考虑。

还有许多问题可以提出和解决,但这个过程所展示的是,通过生成不同的问题,我被要求思考该功能设计的各个方面。有些问题我可以选择排除,或者暂时搁置以后的讨论,有些问题则帮助我提高功能的质量,提高我对验证和日期时间格式化的认识。

4.4.2 循环 1:保存时间表条目

在我脑海中有来自前一个提示的问题后,我开始我的第一个循环,通过在我的 IDE 中创建一个空的 Maven 项目,然后前往 pom.xml 添加所需的依赖项。我需要 JUnit 5 来构建我的单元检查,所以我输入了注释:

<!--    Junit jupiter engine-->

从 Copilot 返回建议的代码块:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

在撰写时,junit-jupiter-engine 的建议版本是旧版本,所以我更新到 5.9.2,如下所示:

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

这次必要的更新是数据来源如何影响建议的一个很好的例子。 Copilot 虽然不断地在 GitHub 上推送的代码上进行训练,但存在落后于最新版本库和 API 的风险。因此,在通过 AI 代码助手添加依赖项时,我们需要保持警惕,以确保它们提供的是我们想要的版本。

此外,这里演示了 Copilot IDE 插件将我编写的代码(或在本例中是代码注释),添加到提示中,然后发送给 Copilot LLM 进行处理。LLM 然后向 IDE 插件发送一个建议,提示我输入下一个内容。然后我可以选择通过按 Tab 键接受建议,或继续编写自己的代码。

像其他 LLMs 一样,Copilot 是通过提示触发的。但与基于聊天的 LLM(如 ChatGPT)不同,Copilot 被调整为处理基于代码而不是文本的提示。这个区别很重要,因为它突显了为不同类型的活动调优 LLMs 的不同类型的好处,以及编写适用于不同类型提示的必要性。这就是为什么 TDD 和 AI 助手是一个有趣的组合来共同使用的原因。我们创建的单元检查不仅构成了我们工作的设计框架,还作为提示来告知我们如何实现功能。

例如,对于我们的第一个检查,我提示 Copilot 为我创建第一个单元检查,方法是将以下注释添加到一个名为TimesheetTest的新类中,该类位于src/test/java中:

// Test that when a timesheet is submitted with a project name and hours it returns true
This triggers Copilot to suggest the following unit check:
@Test
public void testSubmitTimesheetWithProjectNameAndHours() {
    Timesheet timesheet = new Timesheet();
    boolean result = timesheet.submitTimesheet("Project 1", 8);
    assertEquals(true, result);
}

查看这个建议的检查,我们看到它具备我们需要的必要细节。它为我打算构建的类起了一个合理的名字Timesheet,并建议了正确的参数项目名称和工时的方法submitTimesheet。这个检查足够提示,当我在src/main/java创建一个新的类Timesheet时,Copilot 建议:

public boolean submitTimesheet(String projectName, int duration) {
    return true;
}

单元检查作为提示,促使 Copilot 创建我的生产代码,虽然产生的东西并不是非常激动人心,但检查已经完成。我们还可以看到 Copilot 通过建立提示来获取我们想要的。首先,我创建了一个形式为代码注释的提示,以帮助 Copilot 建议单元检查的代码,然后该单元检查作为建议生产代码的提示。随着单元检查的增加,Copilot 的提示和指导将增加。现在让我们看看我如何使用这个过程来完善submitTimesheet方法。

4.4.3 循环 2:检索时间表条目

通过第一个循环,我创建了项目的骨架,但目前实际的生产代码几乎没有成果。因此,在第二个循环中,我试图添加更多功能到Timesheet类以帮助完善submitTimesheet方法。同样,我首先在TimesheetTest中添加了一个新的注释提示:

// Test that when timesheets are added they can be retrieved as a list

在创建新行时,Copilot 返回了以下检查作为建议:

@Test
public void testAddTimesheetsToList() {
    Timesheet timesheet = new Timesheet();
    timesheet.submitTimesheet("Project 1", 8);
    timesheet.submitTimesheet("Project 2", 8);
    timesheet.submitTimesheet("Project 3", 8);
    assertEquals(3, timesheet.getTimesheets().size());
}

这次,创建的检查是使用submitTimesheet方法创建一些数据,然后我可以使用新创建的getTimesheets方法进行检查。所以,转到Timesheet类,我使用 Copilot 生成必要的getTimesheets方法,它返回以下内容:

public Collection<Timesheet> getTimesheets() {
    return null;
}

虽然它为我创建了方法签名,但方法的内部并不那么有用。然而,然后我在类的顶部添加了以下内容:

private HashMap<String, Integer> timesheets = new HashMap<>();

然后返回submitTimesheet方法,并从方法内部删除return true。当我将关键字if输入到语句中时,Copilot 返回以下结果:

public boolean submitTimesheet(String projectName, int duration) {
    if (projectName != null && duration > 0) {
        timesheets.put(projectName, duration);
        return true;
    } else {
        return false;
    }
}

这是一个有用的演示,说明了当使用 Copilot 时,项目需要一定的预热时间,LLM 才能返回更准确的建议。返回submitTimesheet方法,清空其内容,然后等待 Copilot 的响应,我得到了来自 Copilot 的基于我提供的新详细信息的更新响应。就像对话 LLM 需要明确和明确的详细信息提示一样,Copilot 也是如此。最初从 Copilot 返回的标准方法可能是因为缺乏要处理的上下文。基本上,发送给 Copilot 的提示缺乏信息。但是随着我创建新的单元检查和额外的代码来展示我们在代码中的意图,建议变得更加有用。

当我完全删除getTimesheets方法时,这也得到了证实。随着添加到类中的新HashMap,我的更新代码促使 Copilot 返回方法的更新版本:

public Collection<Integer> getTimesheets() {
    return timesheets.values();
}

在这个循环之后运行我的两个单元检查,我可以看到两个检查都通过了,现在我有了一个比我开始循环时更丰富一些的工作代码。

4.4.4 循环 3:计算项目的时间

对于最后一个循环,我回到了 ChatGPT 返回的问题,并考虑了这个问题:

How will the system handle potential conflicts if multiple users try to update the same project's timesheet simultaneously?

虽然目前项目中没有多用户功能,但 ChatGPT 的问题让我思考如何处理对同一项目的多次工时提交。因此,我创建了第三个单元检查来处理这种情况,再次创建代码注释以提示 Copilot 进行另一个单元检查:

// Test that the total hours worked can be calculated from a list of timesheets from one project

返回给我的是以下单元检查:

@Test
public void testCalculateTotalHoursWorked() {
    Timesheet timesheet = new Timesheet();
    timesheet.submitTimesheet("Project 1", 8);
    timesheet.submitTimesheet("Project 1", 8);
    timesheet.submitTimesheet("Project 1", 8);
    assertEquals(24, timesheet.getTimesheets().stream().mapToInt(Integer::intValue).sum());
}

这一次,建议的检查接近,但我希望Timesheet类返回一个总数,而不是在单元检查本身中处理总数。因此,我选择更新检查,明确说明有一个方法可以获取总工时:

@Test
public void testCalculateTotalHoursWorked() {
    Timesheet timesheet = new Timesheet();
    timesheet.submitTimesheet("Project 1", 8);
    timesheet.submitTimesheet("Project 1", 8);
    timesheet.submitTimesheet("Project 1", 8);
    int total = timesheet.getTotalTimesheetHours("Project 1");
    assertEquals(24, total);
}

返回到Timesheet并等待 Copilot,LLM 返回以下代码:

public int getTotalTimesheetHours(String projectName) {
    return timesheets.get(projectName);
}

这使得代码可以编译,但我的新单元检查失败了,因为项目计数没有被更新。相反,因为我使用了HashMap,计数被覆盖了。我需要更新submitTimesheet以处理重复的项目,我在submitTimesheet中刚开始的 if 语句之后添加了以下注释:

// Check to see if project already exists
Dropping in the code comment returns me the following suggested code:
if (timesheets.containsKey(projectName)) {
    // If it does, add the new duration to the existing total
    duration += timesheets.get(projectName);
}

submitTimesheet的上下文中,更新它以增加工时表中现有项目的持续时间:

public boolean submitTimesheet(String projectName, int duration) {
    if (projectName != null && duration > 0) {
        // Check to see if project already exists
        if (timesheets.containsKey(projectName)) {
            // If it does, add the new duration to the existing total
            duration += timesheets.get(projectName);
        }
        timesheets.put(projectName, duration);
        return true;
    } else {
        return false;
    }
}

我的三个单元测试的最后一次运行确认它们都通过了,我在Timesheet类中拥有了我想要的所有功能。然而,代码开始变得更加复杂,所以我把注意力转向了使用 ChatGPT 来重构我的代码。

AI 辅助测试(MEAP)(一)(5)https://developer.aliyun.com/article/1516297

相关文章
|
1天前
|
机器学习/深度学习 人工智能 监控
探索自动化测试的未来:AI与机器学习的融合之路
【6月更文挑战第16天】随着技术的快速发展,软件测试领域正经历着前所未有的变革。自动化测试,作为提高软件质量与效率的关键手段,正在逐步融入人工智能(AI)和机器学习(ML)的先进技术。本文将探讨AI与ML如何赋能自动化测试,提升测试用例的智能生成、优化测试流程、预测潜在缺陷,并分析面临的挑战与未来的发展趋势。
13 3
|
2天前
|
机器学习/深度学习 人工智能 测试技术
探索软件测试中的AI革命
【6月更文挑战第15天】随着人工智能技术的飞速发展,软件测试领域正经历一场前所未有的变革。本文将深入探讨AI如何重塑软件测试的流程、工具和思维方式,以及这一趋势对测试工程师技能要求的影响。
15 3
|
4天前
|
机器学习/深度学习 人工智能 安全
2024年AI辅助研发趋势
2024年AI辅助研发趋势
13 0
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试中的AI应用
【6月更文挑战第13天】随着人工智能技术的飞速发展,其在软件测试领域的应用也日益广泛。本文将深入探讨AI在软件测试中的具体应用,包括自动化测试、缺陷预测、性能优化等方面,旨在为读者提供一个全新的视角来理解AI技术如何改变传统的软件测试流程,提高测试效率和质量。
|
5天前
|
机器学习/深度学习 敏捷开发 人工智能
探索软件测试中的AI辅助技术
【6月更文挑战第12天】在软件开发生命周期中,测试环节是确保产品质量的关键环节。随着人工智能技术的飞速发展,AI辅助的软件测试方法正在改变传统的测试流程。本文将探讨AI如何优化测试过程,提高缺陷检测的准确性和效率,并预测未来AI在软件测试领域的应用趋势。
16 1
|
6天前
|
人工智能 算法 测试技术
探索AI在软件测试中的应用与挑战
【6月更文挑战第11天】本文探讨了人工智能(AI)技术在软件测试领域的应用及其面临的挑战。通过分析AI技术的优势和局限性,文章旨在为读者提供一个全面的视角,以理解AI如何改变传统的软件测试流程,并预测未来可能的发展趋势。
|
8天前
|
机器学习/深度学习 人工智能 算法
探索软件测试的新时代:AI与自动化的融合
【6月更文挑战第9天】本文将探讨软件测试领域内的最新发展趋势,特别是人工智能(AI)和自动化技术的融合如何重新定义了软件测试的实践。我们将分析这些技术如何提高测试效率、准确性和可靠性,以及它们对测试工程师角色的影响。
|
11天前
|
机器学习/深度学习 人工智能 算法
探索软件测试中的AI应用
【6月更文挑战第6天】随着人工智能的不断进步,它在软件测试领域的应用也日益广泛。本文将深入探讨AI在软件测试中的角色,以及如何利用这些技术提升测试效率和质量。通过具体案例分析,我们将揭示AI技术如何帮助测试人员更快地识别缺陷,预测潜在的错误,并提供自动化测试解决方案。
|
12天前
|
机器学习/深度学习 人工智能 算法
软件测试的未来:AI和自动化的融合
【6月更文挑战第5天】在这篇文章中,我们将探讨软件测试的未来,特别是AI和自动化如何改变这个领域。我们将讨论这些技术如何提高测试效率,减少错误,并帮助开发人员更快地发布高质量的软件。
15 0
|
13天前
|
机器学习/深度学习 人工智能 算法
探索软件测试中的AI应用
【6月更文挑战第4天】本文探讨了人工智能(AI)在软件测试领域的应用,分析了AI技术如何提高测试效率和准确性。通过实例分析,文章展示了AI在自动化测试、缺陷预测、测试用例生成等方面的优势,并讨论了实施AI技术时可能遇到的挑战。