Token导航 LogoToken导航

Agent Skill · 前端设计

testing-android-code(测试安卓代码)

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

testing-android-code 是前端设计类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在前端设计类的 10,216 个 Skill 里排第 3,620。

总安装 1,223周安装 52GitHub Stars 8,708下载 428核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:testing-android-code(测试安卓代码)
来源仓库:https://github.com/bitwarden/android
仓库路径:skills/testing-android-code
安装命令:
npx skills add https://github.com/bitwarden/android --skill testing-android-code
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/bitwarden/android --skill testing-android-code

这个 Skill 是做什么的

前端设计类 Skill 关注页面结构、视觉规范和组件写法,输出通常是可运行的界面代码。

Bitwarden 特定的关键测试模式: BaseViewModelTest - 使用 stateEventFlow() 自动调度程序设置 帮手 BitwardenComposeTest - 预先配置所有管理器和主题 BaseServiceTest - 用于网络测试的 MockWebServer 设置 涡轮流量测试 - StateFlow(重播)与 EventFlow(无重播) 测试数据生成器 - 一致数字:Int 参数模式 假实现 - FakeDispatcherManager、FakeConfigDiskSource 结果类型测试 - .asSuccess(), .asFailure() 请务必查阅:docs/ARCHITECTURE.md 以及现有的测试文件以供参考实现。

参考文档 详细信息请参见: 参考文献/测试基类.md - 详细的基类文档和使用模式 参考文献/flow-testing-patterns.md - StateFlow/EventFlow 的完整 Turbine 模式 参考文献/批判性陷阱.md - 完整的反模式参考和调试技巧 完整示例: 示例/viewmodel-test-example.md - 使用 StateFlow/EventFlow 进行完整 ViewModel 测试 示例/compose-screen-test-example.md - 全合成屏幕测试 示例/repository-test-example.md - 带有模拟和假货的完整存储库测试 每周安装量 52 存储库 比特沃登/安卓 GitHub 之星 8.7K 第一次看到 1 天前 安全审计 Gen Agent Trust Hub 通行证 套接字通行证 斯尼克通行证

来源仓库内路径:skills/testing-android-code

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/bitwarden/android --skill testing-android-code;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

testing-android-code 怎么安装?

在终端执行 npx skills add https://github.com/bitwarden/android --skill testing-android-code。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

testing-android-code 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

testing-android-code 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

testing-android-code 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

testing-android-code 用的人多吗?

公开数据是累计安装 1,223 次,近一周安装 52 次,下载 428 次,GitHub 8,708 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

testing-android-code 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。
  • 来源仓库有 8,708 星,维护活跃度相对可查。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理前端设计类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

前端设计类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
frontend-design

前端设计 · Codex、Claude

8,823,360126,072只读MIT通过
vercel-composition-patterns

Vercel 组合模式 · Codex、Claude

3,858,81625,893需要联网MIT通过
vercel-react-native-skills

Vercel React native skills 前端 · Codex、Claude

2,468,66425,878只读MIT通过
adapt

adapt 搜索 · Codex、Claude

2,027,04023,125操作浏览器未明确通过
bolder

bolder 分析 · Codex、Claude

2,004,28823,130只读未明确通过
testing-android-code

测试安卓代码 · 本页

1,2238,708需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Testing Android Code - Bitwarden Testing Patterns

This skill provides tactical testing guidance for Bitwarden-specific patterns. For comprehensive architecture and testing philosophy, consult docs/ARCHITECTURE.md.

Test Framework Configuration

Required Dependencies:

  • JUnit 5 (jupiter), MockK, Turbine (app.cash.turbine)
  • kotlinx.coroutines.test, Robolectric, Compose Test

Critical Note: Tests run with en-US locale for consistency. Don't assume other locales.


A. ViewModel Testing Patterns

Base Class: BaseViewModelTest

Always extend BaseViewModelTest for ViewModel tests.

Location: ui/src/testFixtures/kotlin/com/bitwarden/ui/platform/base/BaseViewModelTest.kt

Benefits:

  • Automatically registers MainDispatcherExtension for UnconfinedTestDispatcher
  • Provides stateEventFlow() helper for simultaneous StateFlow/EventFlow testing

Pattern:

class ExampleViewModelTest : BaseViewModelTest() {
    private val mockRepository: ExampleRepository = mockk()
    private val savedStateHandle = SavedStateHandle(mapOf(KEY_STATE to INITIAL_STATE))

    @Test
    fun `ButtonClick should fetch data and update state`() = runTest {
        coEvery { mockRepository.fetchData(any()) } returns Result.success("data")

        val viewModel = ExampleViewModel(savedStateHandle, mockRepository)

        viewModel.stateFlow.test {
            assertEquals(INITIAL_STATE, awaitItem())
            viewModel.trySendAction(ExampleAction.ButtonClick)
            assertEquals(INITIAL_STATE.copy(data = "data"), awaitItem())
        }

        coVerify { mockRepository.fetchData(any()) }
    }
}

For complete examples: See references/test-base-classes.md

StateFlow vs EventFlow (Critical Distinction)

Flow TypeReplayFirst ActionPattern
StateFlowYes (1)awaitItem() gets current stateExpect initial → trigger → expect new
EventFlowNoexpectNoEvents() firstexpectNoEvents → trigger → expect event

For detailed patterns: See references/flow-testing-patterns.md


B. Compose UI Testing Patterns

Base Class: BitwardenComposeTest

Always extend BitwardenComposeTest for Compose screen tests.

Location: app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/base/BitwardenComposeTest.kt

Benefits:

  • Pre-configures all Bitwarden managers (FeatureFlags, AuthTab, Biometrics, etc.)
  • Wraps content in BitwardenTheme and LocalManagerProvider
  • Provides fixed Clock for deterministic time-based tests

Pattern:

class ExampleScreenTest : BitwardenComposeTest() {
    private var haveCalledNavigateBack = false
    private val mutableEventFlow = bufferedMutableSharedFlow<ExampleEvent>()
    private val mutableStateFlow = MutableStateFlow(DEFAULT_STATE)
    private val viewModel = mockk<ExampleViewModel>(relaxed = true) {
        every { eventFlow } returns mutableEventFlow
        every { stateFlow } returns mutableStateFlow
    }

    @Before
    fun setup() {
        setContent {
            ExampleScreen(
                onNavigateBack = { haveCalledNavigateBack = true },
                viewModel = viewModel,
            )
        }
    }

    @Test
    fun `on back click should send BackClick action`() {
        composeTestRule.onNodeWithContentDescription("Back").performClick()
        verify { viewModel.trySendAction(ExampleAction.BackClick) }
    }
}

Note: Use bufferedMutableSharedFlow for event testing in Compose tests. Default replay is 0; pass replay = 1 if needed.

For complete base class details: See references/test-base-classes.md


C. Repository and Service Testing

Service Testing with MockWebServer

Base Class: BaseServiceTest (network/src/testFixtures/)

class ExampleServiceTest : BaseServiceTest() {
    private val api: ExampleApi = retrofit.create()
    private val service = ExampleServiceImpl(api)

    @Test
    fun `getConfig should return success when API succeeds`() = runTest {
        server.enqueue(MockResponse().setBody(EXPECTED_JSON))
        val result = service.getConfig()
        assertEquals(EXPECTED_RESPONSE.asSuccess(), result)
    }
}

Repository Testing Pattern

class ExampleRepositoryTest {
    private val fixedClock: Clock = Clock.fixed(
        Instant.parse("2023-10-27T12:00:00Z"),
        ZoneOffset.UTC,
    )
    private val dispatcherManager = FakeDispatcherManager()
    private val mockDiskSource: ExampleDiskSource = mockk()
    private val mockService: ExampleService = mockk()

    private val repository = ExampleRepositoryImpl(
        clock = fixedClock,
        exampleDiskSource = mockDiskSource,
        exampleService = mockService,
        dispatcherManager = dispatcherManager,
    )

    @Test
    fun `fetchData should return success when service succeeds`() = runTest {
        coEvery { mockService.getData(any()) } returns expectedData.asSuccess()
        val result = repository.fetchData(userId)
        assertTrue(result.isSuccess)
    }
}

Key patterns: Use FakeDispatcherManager, fixed Clock, and .asSuccess() helpers.


D. Test Data Builders

Builder Pattern with Number Parameter

Location: network/src/testFixtures/kotlin/com/bitwarden/network/model/

fun createMockCipher(
    number: Int,
    id: String = "mockId-$number",
    name: String? = "mockName-$number",
    // ... more parameters with defaults
): SyncResponseJson.Cipher

// Usage:
val cipher1 = createMockCipher(number = 1)  // mockId-1, mockName-1
val cipher2 = createMockCipher(number = 2)  // mockId-2, mockName-2
val custom = createMockCipher(number = 3, name = "Custom")

Available Builders (35+):

  • Cipher: createMockCipher(), createMockLogin(), createMockCard(), createMockIdentity(), createMockSecureNote(), createMockSshKey(), createMockField(), createMockUri(), createMockFido2Credential(), createMockPasswordHistory(), createMockCipherPermissions()
  • Sync: createMockSyncResponse(), createMockFolder(), createMockCollection(), createMockPolicy(), createMockDomains()
  • Send: createMockSend(), createMockFile(), createMockText(), createMockSendJsonRequest()
  • Profile: createMockProfile(), createMockOrganization(), createMockProvider(), createMockPermissions()
  • Attachments: createMockAttachment(), createMockAttachmentJsonRequest(), createMockAttachmentResponse()

See network/src/testFixtures/kotlin/com/bitwarden/network/model/ for full list.


E. Result Type Testing

Locations:

  • .asSuccess(), .asFailure(): core/src/main/kotlin/com/bitwarden/core/data/util/ResultExtensions.kt
  • assertCoroutineThrows: core/src/testFixtures/kotlin/com/bitwarden/core/data/util/TestHelpers.kt
// Create results
"data".asSuccess()              // Result.success("data")
throwable.asFailure()           // Result.failure<T>(throwable)

// Assertions
assertTrue(result.isSuccess)
assertEquals(expectedValue, result.getOrNull())

F. Test Utilities and Helpers

Fake Implementations

FakeLocationPurpose
FakeDispatcherManagercore/src/testFixtures/Deterministic coroutine execution
FakeConfigDiskSourcedata/src/testFixtures/In-memory config storage
FakeSharedPreferencesdata/src/testFixtures/Memory-backed SharedPreferences

Exception Testing (CRITICAL)

// CORRECT - Call directly, NOT inside runTest
@Test
fun `test exception`() {
    assertCoroutineThrows<IllegalStateException> {
        repository.throwingFunction()
    }
}

Why: runTest catches exceptions and rethrows them, breaking the assertion pattern.


G. Critical Gotchas

Common testing mistakes in Bitwarden. For complete details and examples: See references/critical-gotchas.md

Core Patterns:

  • assertCoroutineThrows + runTest - Never wrap in runTest; call directly
  • Static mock cleanup - Always unmockkStatic() in @After
  • StateFlow vs EventFlow - StateFlow: awaitItem() first; EventFlow: expectNoEvents() first
  • FakeDispatcherManager - Always use instead of real DispatcherManagerImpl
  • Coroutine test wrapper - Use runTest {} for all Flow/coroutine tests

Assertion Patterns:

  • Complete state assertions - Assert entire state objects, not individual fields
  • JUnit over Kotlin - Use assertTrue(), not Kotlin's assert()
  • Use Result extensions - Use asSuccess() and asFailure() for Result type assertions

Test Design:

  • Fake vs Mock strategy - Use Fakes for happy paths, Mocks for error paths
  • DI over static mocking - Extract interfaces (like UuidManager) instead of mockkStatic
  • Null stream testing - Test null returns from ContentResolver operations
  • bufferedMutableSharedFlow - Use with .onSubscription {emit(state)} in Fakes
  • Test factory methods - Accept domain state types, not SavedStateHandle

H. Test File Organization

Directory Structure

module/src/test/kotlin/com/bitwarden/.../
├── ui/*ScreenTest.kt, *ViewModelTest.kt
├── data/repository/*RepositoryTest.kt
└── network/service/*ServiceTest.kt

module/src/testFixtures/kotlin/com/bitwarden/.../
├── util/TestHelpers.kt
├── base/Base*Test.kt
└── model/*Util.kt

Test Constants Placement

Declare test constants as top-level private const val at the bottom of the file, after the class closing brace. Do NOT use companion object for test constants.

Test Naming

  • Classes: *Test.kt, *ScreenTest.kt, *ViewModelTest.kt
  • Functions: ` given state when action should result `

Summary

Key Bitwarden-specific testing patterns:

  1. BaseViewModelTest - Automatic dispatcher setup with stateEventFlow() helper
  2. BitwardenComposeTest - Pre-configured with all managers and theme
  3. BaseServiceTest - MockWebServer setup for network testing
  4. Turbine Flow Testing - StateFlow (replay) vs EventFlow (no replay)
  5. Test Data Builders - Consistent number: Int parameter pattern
  6. Fake Implementations - FakeDispatcherManager, FakeConfigDiskSource
  7. Result Type Testing - .asSuccess(), .asFailure()

Always consult: docs/ARCHITECTURE.md and existing test files for reference implementations.


Reference Documentation

For detailed information, see:

  • references/test-base-classes.md - Detailed base class documentation and usage patterns
  • references/flow-testing-patterns.md - Complete Turbine patterns for StateFlow/EventFlow
  • references/critical-gotchas.md - Full anti-pattern reference and debugging tips

Complete Examples:

  • examples/viewmodel-test-example.md - Full ViewModel test with StateFlow/EventFlow
  • examples/compose-screen-test-example.md - Full Compose screen test
  • examples/repository-test-example.md - Full repository test with mocks and fakes

平台分布

Codex

33.34%
按下载量换算143

Claude

30.74%
按下载量换算132

Cursor

20.38%
按下载量换算87

Gemini CLI

9.12%
按下载量换算39

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills