Android检测测试 - 包结构的最佳实践

时间:2017-12-14 09:21:45

标签: android android-espresso

我正在使用浓缩咖啡进行仪器测试。我的生产源代码的结构类似于下图:

enter image description here

我想知道的是androidTest(检测测试包)是否应遵循相同的层次结构?有什么好处?如果我不遵循相同的仪表测试的层次结构,它会导致任何可扩展性问题或一般问题吗?现在我已经创建了instrumentation tests文件夹,它与生产源代码完全不同,一切正常,但我看到开发人员保持包装一致的博客,为什么?并且要清楚,对于单元测试,我会保持它们与匹配包有意义相同,但我不太确定仪器测试。

1 个答案:

答案 0 :(得分:2)

Instrumentation测试是关于测试不同的app组件协同工作以实现某些功能,例如,在提供的应用程序中,登录。由于这是一个高级概述,它将使事情很容易找到某些高级功能的测试肯定会包含有关该功能的更细粒度的测试,例如在电子邮件字段中输入无效的电子邮件格式等。所以我个人认为这样的仪器测试结构如下:

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等)的组件时...... / p>

所以在这种情况下,我个人最终会得到这样的结论:

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,您就可以获得每个变体(无论是testandroidTest还是无变体)的目录结构。有关详细信息,请查看此链接:Configure Build Variants。另外,在构建测试时,请不要忘记在@Rule中结帐JUnit

作为最后的总结,链接到一个好的Codelab示例来说明上述大部分内容:Android Testing Codelab