mcpField
B
build-test-verify

build-test-verify

github.com/bitwarden测试与质量9.6k47 次安装今天更新
代码仓库

关于 build-test-verify

为 Bitwarden Android 项目提供构建、测试、静态分析和代码库查找指引,面向参与开发与验证的工程师。内容涵盖构建变体、测试命令及测试报告定位。

主要功能

  1. 01Android 构建命令参考
  2. 02单元测试与报告指引
  3. 03detekt 与 Android Lint
  4. 04代码库组件查找
  5. 05版本与发布渠道说明

适用场景

  1. 01构建 debug 或 release 版本
  2. 02运行指定模块或测试类
  3. 03检查暂存文件的 detekt 结果
  4. 04查找 UI 组件与 ViewModel

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bitwarden/android --skill build-test-verify

安装后在 Claude Code 中输入/build-test-verify确认已加载。

详细介绍

构建、测试与验证

环境设置

变量必需描述
GITHUB_TOKEN是(CI)SDK 的 GitHub Packages 身份验证(read:packages 范围)
构建变体-standard(Play Store)、fdroid(无 Google 服务)
构建类型-debug、beta、release

如果构建时无法解析 Bitwarden SDK,请检查 user.properties 或环境中的 GITHUB_TOKEN,并确认可以连接到 maven.pkg.github.com。


构建

# Debug builds
./gradlew app:assembleDebug
./gradlew authenticator:assembleDebug

# Release builds (requires signing keys)
./gradlew app:assembleStandardRelease
./gradlew app:bundleStandardRelease

# F-Droid builds
./gradlew app:assembleFdroidRelease

运行测试

重要:应用模块使用 standard 变体。务必使用 testStandardDebugUnitTest,而非 testDebugUnitTest。

重要:务必在首次运行时通过过滤器传递测试输出,以捕获失败信息。Gradle 默认会隐藏详细的失败输出,因此请使用 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30,无需再次运行即可查看通过/失败结果和断言详情。

# App module tests (correct flavor!)
./gradlew app:testStandardDebugUnitTest 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30

# Run specific test classes
./gradlew app:testStandardDebugUnitTest --tests "com.x8bit.bitwarden.SomeTest" 2>&1 | grep -E "FAILED|BUILD|expected:|actual:|AssertionError|failures" | head -30

# Run all unit tests across all modules
./gradlew test

# Individual shared modules (no flavor needed)
./gradlew :core:test
./gradlew :data:test
./gradlew :network:test
./gradlew :ui:test

# Authenticator module
./gradlew authenticator:testStandardDebugUnitTest
查看测试报告

如果需要 grep 未捕获的完整失败详情,请查看 HTML 测试报告:

# After a test run, open the report at:
# app/build/reports/tests/testStandardDebugUnitTest/index.html
# Or read individual failure XML:
find app/build/test-results -name "*.xml" -exec grep -l "failure" {} \;
测试结构
app/src/test/                    # App unit tests
app/src/testFixtures/            # App test utilities
core/src/testFixtures/           # Core test utilities (FakeDispatcherManager)
data/src/testFixtures/           # Data test utilities (FakeSharedPreferences)
network/src/testFixtures/        # Network test utilities (BaseServiceTest)
ui/src/testFixtures/             # UI test utilities (BaseViewModelTest, BaseComposeTest)
测试速查
  • 分发器控制:使用 :core:testFixtures 中的 FakeDispatcherManager
  • MockK:用于模拟的 mockk<T> { every { } returns },用于挂起函数的 coEvery { }
  • Flow 测试:使用 Turbine 和 BaseViewModelTest 中的 stateEventFlow() 助手
  • 时间控制:注入 Clock,以进行确定性时间测试

Lint 与静态分析

重要:优先仅对修改过的文件运行 detekt——扫描整个项目既慢,在开发过程中也没有必要。项目支持 -Pprecommit=true 标志,可将 detekt 限制为已暂存文件。

重要:务必通过过滤器传递 detekt 输出,以便在首次运行时捕获错误。detekt 会向 stderr/stdout 输出违规详情,但 Gradle 可能会使其难以查看。使用下方的 grep 模式即可立即查看违规项。

# Detekt on staged files only (preferred during development)
git add -u && ./gradlew -Pprecommit=true detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40

# Detekt on all files (full scan, use sparingly)
./gradlew detekt 2>&1 | grep -E "FAILED|BUILD|Line |Rule |Signature|detekt" | head -40

# Android Lint
./gradlew lint

# Full validation suite (detekt + lint + tests + coverage)
./fastlane check
-Pprecommit=true 的工作原理

根目录下的 build.gradle.kts 会配置 detekt 任务:设置此属性后,使用 git diff --name-only --cached,将分析范围限制为已暂存文件。这与项目的 pre-commit hook 使用相同机制。运行前请使用 git add 暂存更改。


代码库探索

# Find existing Bitwarden UI components
find ui/src/main/kotlin/com/bitwarden/ui/platform/components/ -name "Bitwarden*.kt" | sort

# Find all ViewModels
grep -rl "BaseViewModel<" app/src/main/kotlin/ --include="*.kt"

# Find all Navigation files with @Serializable routes
find app/src/main/kotlin/ -name "*Navigation.kt" | sort

# Find all Hilt modules
find app/src/main/kotlin/ -name "*Module.kt" -path "*/di/*" | sort

# Find all repository interfaces
find app/src/main/kotlin/ -name "*Repository.kt" -not -name "*Impl.kt" -path "*/repository/*" | sort

# Find encrypted disk source examples
grep -rl "EncryptedPreferences" app/src/main/kotlin/ --include="*.kt"

# Find Clock injection usage
grep -rl "private val clock: Clock" app/src/main/kotlin/ --include="*.kt"

# Search existing strings before adding new ones
grep -n "search_term" ui/src/main/res/values/strings.xml

部署与版本管理

版本位置:gradle/libs.versions.toml

appVersionCode = "1"
appVersionName = "2025.11.1"

格式:YEAR.MONTH.PATCH

发布渠道:

  • Play Store:使用已签名 AAB 的 GitHub Actions 工作流
  • F-Droid:使用 F-Droid 签名密钥的专用工作流
  • Firebase App Distribution:Beta 测试

评论

支持 Markdown