Products
GG网络技术分享 2026-04-16 01:17 1
精辟。 唉, 说实话,Jetpack Compose这玩意儿挺好用的,但是测试起来……简直就是一场噩梦!特别是那些UI测试,写起来费劲,读起来更费劲。我之前写过一套测试用例,回头一看,我自己都不知道在测什么。后来我痛定思痛,开始研究BDD,发现它简直是救星!虽然Jetpack Compose本身没直接支持那些花里胡哨的注解,但是我们可以用命名约定来模拟一下嘛!反正效果差不多。
BDD啊,简单来说就是先从用户的角度定义系统的行为。你得想清楚用户会怎么用你的App,然后把这些行为写成故事。比如:“当用户点击按钮时屏幕上应该显示欢迎信息”。 听起来是不是很直观?传统的测试往往是从技术细节入手,而BDD是从用户需求出发。这样写出来的测试代码不仅易于理解,还能促进开发人员和测试人员之间的沟通。而且最重要的是…减少bug啊,胡诌。!

说到BDD就不得不提“Given”、“When”、“Then”。这三个词就像魔法咒语一样。 Given: 描述初始状态, 就是准备工作, 确保一切都处于一个已知的、 可控的状态. 比如: "Given 用户已登录" When: 描述触发事件, 就是用户做了什么操作. 比如:"When 用户点击了提交按钮" Then: 描述期望后来啊, 就是发生的事情. 比如:"Then 应该显示成功提示" 虽然Jetpack Compose的测试框架没有直接提供这些注解, 我爱我家。 但是我们可以通过函数命名来表达这些概念嘛!
先说说得搞清楚Compose的UI Test是怎么玩的。需要用到createComposeRule这个东西。它允许你在JUnit Test环境中创建和管理Composable函数。记住哦!一定要用这个Rule!不然你可能会遇到各种奇怪的问题。
import androidx.compose.ui.test.junit4.createComposeRule
import org.junit.Rule
import org.junit.Test
class Test {
@get:Rule val composeTestRule = createComposeRule
// Test code...
}
对了,别忘了添加依赖项! 不然编译都过不去。
| 依赖项 | 版本 |
|---|---|
| androidx.compose.ui:ui-test-junit4 | 最新版本 |
| androidx.compose.ui:ui-test-manifest | 最新版本 |
差点意思。 假设我们有一个按钮, 点击后文本会改变。我们来用“BDD风格”写个测试案例吧。
@Testfun toggleButtonText { // Given: 设置初始状态 var toggled = false { ToggleTextButton { toggled = !toggled } } // When: 用户点击按钮 .performClick // Then: 验证文本已更改 .assertIsDisplayed // After: 清理步骤里实现..}
太水了。 你看!虽然没有那些注解, 但是通过函数名和代码结构,我们也能清晰地表达出“Given”、“When”、“Then”的概念。是不是很巧妙?当然了, 如果你喜欢的话, 可以自己定义一些自定义注解.
// 自定义注解annotation class Givenannotation class Whenannotation class Thenannotation class After@Testfun `Toggle button text with custom annotations` { @Given fun setupInitialState { // 初始状态 } @When fun performUserAction { // 用户动作 } @Then fun checkOutcome { // 验证后来啊 } @After fun tearDown { // 清理资源 }}
如果你的UI界面很复杂, 有很多组件和交互逻辑怎么办? 不要慌! 可以把 我好了。 一个大的测试案例拆分成多个小的测试案例, 每个案例只关注一个特定的行为.
| 组件名称 | 功能简介 | 适用场景 |
|---|---|---|
| TextField | 用于接收用户输入文本 | 注册、 登录、搜索等 |
| Button | 触发特定操作 | 提交表单、发起请求等 |
| Image | 展示图片资源 | 头像、商品图片等 |
记得啊 , 多喝水 , 多休息 , 写好bug report ! 加油 !
Demand feedback