我正在使用浓缩咖啡进行仪器测试。我的生产源代码的结构类似于下图:
我想知道的是androidTest(检测测试包)是否应遵循相同的层次结构?有什么好处?如果我不遵循相同的仪表测试的层次结构,它会导致任何可扩展性问题或一般问题吗?现在我已经创建了instrumentation tests文件夹,它与生产源代码完全不同,一切正常,但我看到开发人员保持包装一致的博客,为什么?并且要清楚,对于单元测试,我会保持它们与匹配包有意义相同,但我不太确定仪器测试。
Instrumentation测试是关于测试不同的应用程序组件协同工作以实现某些功能,例如,在提供的应用程序中,登录。由于这是一个高级概述,它将使事情很容易找到某些高级功能的测试,这肯定包含关于该功能的更细粒度的测试,例如在电子邮件字段中输入无效的电子邮件格式等。所以我个人认为这样的仪器测试结构如下:
androidTest
\--- java
\--- com.example.myapp
+--- login
| +--- LoginTest (Class, Scenario 1 of high level feature, ex: already signed up login)
| | +--- valid_email_login (method)
| | +--- invalid_email_login (method)
| | \--- no_internet_connection (method)
| \--- AnotherLoginTest (Class, Scenario 2 of high level feature, ex: create new account login)
| \--- test_for_scenario_2 (method)
\--- another_high_level_feature (and so on...)
这样,在代码更改时,可以轻松地理解和构建测试或更改测试。
使用单元测试,测试是在应用程序的单个(因此所谓的单元)组件上进行的,例如LoginPresenter
。通常,测试会模拟组件所需的所有依赖项(可能使用Mockito
或其他类型的模拟注入),并验证组件是否按逻辑正常运行。请注意,对于最佳实践,单元测试不需要像Context
那样的设备/模拟器或与活动相关的依赖性,因此需要像您的示例MVP中的体系结构才能在本地计算机上执行单元测试(PC或笔记本电脑)。但这并不能阻止您在androidTest
文件夹中创建单元测试,特别是在您正在测试需要设备或模拟器进行硬件相关组件测试(如NFC或GPS等)的组件时...
所以在这种情况下,我个人最终会得到这样的结论:
src
+--- androidTest
| |--- java
| \--- com.example.myapp
| +--- unit
| \--- (unit\component related tests that need device\emulator go here)
| \--- instrumentation (components working together related tests go here)
| +--- login
| | +--- LoginTest (Class, Scenario 1 of high level feature, ex: already signed up login)
| | | +--- valid_email_login (method)
| | | +--- invalid_email_login (method)
| | | \--- no_internet_connection (method)
| | \--- AnotherLoginTest (Class, Scenario 2 of high level feature, ex: create new account login)
| | \--- test_for_scenario_2 (method)
| \--- another_high_level_feature (and so on...)
\--- test
|--- java
\--- com.example.myapp (unit\component related tests that don't need device\emulator go under here)
+--- presenters
| +--- LoginPresenterTest
| | +--- view_loading (method)
| | +--- disable_views_when_loading (method)
| | \--- another_unit_test (method)
| \--- AnotherPresenterTest
\--- models (and so on...)
关于您的应用程序所包含的不同变体,Android Gradle Plugin为您提供了一个命令,可以找出放置变体相关测试的位置。只需在您的项目根目录中运行gradlew :app:sourceSets
,您就可以获得每个变体(无论是test
,androidTest
还是none)的目录结构。有关更多信息,请访问此链接:Configure Build Variants。另外,在建立测试时,不要忘记在@Rule
结帐JUnit
。
作为最后的总结,链接到一个很好的Codelab示例来说明上面的大部分内容:Android Testing Codelab