采用BDD原则在Jetpack Compose进行 UI Test

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: BDD(行为驱动开发)是一种以用户角度定义系统行为的软件开发方法论,与现代UI测试需求高度契合。通过使用如`@Given`、`@When`、`@Then`等注解,可提升测试逻辑的可读性与维护性。虽然Jetpack Compose未直接支持这些注解,但可通过命名约定和结构设计模拟实现BDD风格的UI测试,从而增强团队协作、提升测试效率。示例展示了如何在Kotlin中结合JUnit与Compose测试规则编写可读性强的测试用例。

随着界面复杂度的增加,有效的测试策略真的很重要,BDD是一种软件开发方法论,强调从用户角度定义系统的行为,和现代UI Test的需求高度契合。

BDD风格的UI测试框架

首先需要了解基本概念:

  • @Given: 描述Test的前提条件。
  • @When: 表示用户执行的操作。
  • @Then: 验证操作的结果是否符合预期。
  • @After: 用于清理测试环境或资源,可以保证每个Test 都是独立且可重复。

建议要使用createComposeRule()提供的Rule,允许Junit Test 环境中Using Composable函数。

代码语言:kotlin

AI代码解释

import androidx.compose.ui.test.junit4.createComposeRule
import org.junit.Rule
import org.junit.Test
class Test {
    @get:Rule
    val composeTestRule = createComposeRule()
    // Test code...
}

1. 使用BDD风格编写测试案例

如果要为一个简单的按钮编写BDD风格的测试案例,这个按钮点击后会改变文本内容。

定义可组合函数

代码语言:kt

AI代码解释

@Composable
fun ToggleTextButton(onToggle: () -> Unit) {
    var buttonText by remember { mutableStateOf("Text") }
    Button(onClick = {
        buttonText = if (buttonText == "Text") "Toggled Text" else "Initial Text"
        onToggle()
    }) {
        Text(text = buttonText)
    }
}
2. 编写BDD风格的测试案例

实际注解不存在 Jetpack Compose的测试lib中,但可以通过命名约定模仿它们。

代码语言:kt

AI代码解释

@Test
fun toggleButtonText() {
    // Given: 设置初始状态
    var toggled = false
    composeTestRule.setContent {
        ToggleTextButton { toggled = !toggled }
    }
    // When: 用户点击按钮
    composeTestRule.onNodeWithText("Initial Text").performClick()
    // Then: 验证文本已更改
    composeTestRule.onNodeWithText("Toggled Text").assertIsDisplayed()
    // After: 清理步骤里实现..
}

模拟@Given, @When, @Then, @After

或者只是遵循命名约定来达到类似的效果,例如:

代码语言:kt

AI代码解释

// 自定义注解
annotation class Given
annotation class When
annotation class Then
annotation class After
@Test
fun `Toggle button text with custom annotations`() {
    @Given fun setupInitialState() {
        // 初始状态
    }
    @When fun performUserAction() {
        // 用户动作
    }
    @Then fun checkOutcome() {
        // 验证结果
    }
    @After fun tearDown() {
        // 清理资源
    }
}

总结

虽然 Jetpack Compose没有直接支持像@Given@When@Then这样的注解,但是通过合理的命名约定和测试结构设计,有效应用BDD 原则指导我们的UI测试开发过程。为什么这样做?因此提高了测试代码的可读性,促进了团队成员之间的沟通与协作,确保了软件功能按照预期工作。

请注意,在实践中,可能不需要创建真正的注解,而是通过良好的测试方法命名和结构化测试逻辑体现BDD理念。这种方法能够帮助Developer 和QA更好理解和维护测试代码。

然而这里只展示了简化的例子,实际项目中的测试可能会更加复杂,包括更多的前置条件、交互步骤以及断言。此外,利用工具如 Cucumber 等可以进一步增强BDD流程的正式性和自动化程度。

相关文章
|
2月前
|
JSON 人工智能 前端开发
JSON基础知识与实践
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于JavaScript语言的子集,具有易读、易解析和跨语言等优点。它广泛应用于前后端数据交换、API设计、配置文件存储及移动应用开发等场景。JSON数据由键值对构成,支持字符串、数值、布尔值、数组和对象等类型,结构清晰且可嵌套,适合网络传输。自2001年由Douglas Crockford提出后,JSON因其简洁性和灵活性逐渐成为互联网主流数据格式之一,并被标准化为ECMA-404。
271 0
|
2月前
|
人工智能 JSON 编译器
Code和Clang配置C++开发环境
本文介绍了如何在VS Code中配置C++开发环境,包括安装VS Code、C++扩展、Clang编译器,创建并运行Hello World项目,使用IntelliSense、调试程序及自定义配置等内容,帮助开发者快速上手C++开发。
243 0
|
2月前
|
JSON 人工智能 API
工具演变 & MCP基础
本内容介绍了大模型工具调用方式的演进历程,从早期的函数表达阶段到OpenAI的标准化工具定义,再到结构化推理的引入。同时深入解析了MCP(Model Context Protocol)的核心价值,即通过统一协议降低Agent与工具服务集成的工程复杂度,提升工具调用的标准化与效率。
110 0
|
2月前
|
C++
什么是单项式
单项式是代数式中的一种
|
3月前
|
JSON 数据挖掘 API
闲鱼商品列表API响应数据python解析
闲鱼商品列表API(Goodfish.item_list)提供标准化数据接口,支持GET请求,返回商品标题、价格、图片、卖家信息等。适用于电商比价、数据分析,支持多语言调用,附Python示例代码,便于开发者快速集成。
|
8月前
|
分布式计算 并行计算 调度
基于HPC场景的集群任务调度系统LSF/SGE/Slurm/PBS
在HPC场景中,集群任务调度系统是资源管理和作业调度的核心工具。LSF、SGE、Slurm和PBS是主流调度系统。LSF适合大规模企业级集群,提供高可靠性和混合云支持;SGE为经典开源系统,适用于中小规模集群;Slurm成为HPC领域事实标准,支持多架构和容器化;PBS兼具商业和开源版本,擅长拓扑感知调度。选型建议:超大规模科研用Slurm,企业生产环境用LSF/PBS Pro,混合云需求选LSF/PBS Pro,传统小型集群用SGE/Slurm。当前趋势显示Slurm在TOP500系统中占比超60%,而商业系统在金融、制造等领域保持优势。
1367 32
|
7月前
|
安全 算法 网络安全
数字时代的“安全结界”与“票房神话”: 从SSL证书到《哪吒之魔童闹海》的技术与人性共振
**简介:** 在2025年,全球互联网加密流量占比飙升至60%,SSL证书成为互联网“新基建”,从电商支付到社交聊天,保障数据安全。其通过加密技术(如RSA或ECC)防止信息窃取,DV、OV、EV等级别确保不同场景的安全性。SSL证书的普及源于隐私保护需求,市场呈现分层竞争。同时,《哪吒之魔童闹海》以48.39亿票房展现信任重构,其成功与SSL证书的技术逻辑异曲同工,强调内容与技术并重。两者共同揭示了数字时代“可信度”与“体验感”的双重加持,预示着未来赢家需将技术与人文融合。
|
10月前
|
机器学习/深度学习 自然语言处理 算法
政府部门文档管理革新:实现90%自动内容抽取与智能标签化处理!
本文介绍了多模态数据处理技术,涵盖自然语言处理(NLP)、光学字符识别(OCR)和图像识别的技术原理,以及智能分类、标签化处理、系统集成与国产化适配、安全与合规、算法优化等方面的内容。通过这些技术的应用,实现了文档管理的全流程智能化,为用户提供高效、可靠的解决方案。
296 3
|
SQL 安全 Java
Spring Boot中的跨站点脚本攻击(XSS)与SQL注入防护
【6月更文挑战第15天】在现代Web应用程序开发中,安全性是一个至关重要的课题。跨站点脚本攻击(XSS)和SQL注入是最常见的两种攻击类型,它们可以严重威胁到应用程序的安全。
882 0
|
人工智能 开发框架 数据管理
如何才能更加简单开发AI应用?
随着大模型的快速普及,AI应用开发已经成为炙手可热的领域,然而对于许多人来说,开发一款属于自己的AI应用仍然存在一定的门槛。同时,人工智能的迅速发展为各行各业带来了许多机遇和挑战。对于许多开发者和企业来说,开发AI应用仍然是一个复杂且具有挑战性的任务,为了推动AI技术的广泛应用,简化AI应用开发过程变得至关重要。那么接下来就来简单聊聊如何才能更加简单开发AI应用?
476 1
如何才能更加简单开发AI应用?