探索源代码和CalculatorTest
源集是项目中的代码集合,用于不同的构建目标或应用程序的其他“风格”。当 Android Studio 创建您的项目时,它会创建三个源集:
(test)本地单元测试。源集显示(test)在包名称之后。(androidTest),用于 Android 检测测试。源集显示(androidTest)在包名称之后。Android 视图中的java文件夹按包名称列出了应用程序中的所有源集。在这种情况下(如下所示),应用程序代码在com.android.example.SimpleCalc源集中。测试代码位于源集中,test包名称后面的括号中显示:com.android.example.SimpleCalc (test)。

查看该测试代码

检查代码并注意以下几点:
org.junit、org.hamcrest和android.test包。对 Android 框架类没有依赖关系。@RunWith(JUnit4.class)用于运行此类中的测试的运行器。测试运行程序是一个库或一组工具,可以进行测试并将结果打印到日志中。对于具有更复杂设置或基础设施要求的测试(例如 Espresso),您将使用不同的测试运行器。对于此示例,我们使用基本的 JUnit4 测试运行程序。@SmallTest注解表示该类中的所有测试都是没有依赖关系的单元测试,并且以毫秒为单位运行。、@SmallTest和注释是使测试组更容易捆绑到类似功能套件中的约定@MediumTest。@LargeTestsetUp()方法用于在测试前设置环境,并包含@Before注释。在这种情况下,安装程序会创建一个新的Calculator类实例并将其分配给mCalculator成员变量。addTwoNumbers()方法是一个实际测试,并带有注释@Test。只有测试类中具有@Test注释的方法才被视为对测试运行器的测试。请注意,按照惯例,测试方法不包括“测试”一词。addTwoNumbers()调用add()方法Calculator。您只能测试public或的方法package-protected。在这种情况下,它Calculator是一个public带有public方法的类,所以一切都很好。true测试通过的表达式。在这种情况下,断言是您从 add 方法 (1 + 1) 获得的结果与给定的数字 2 匹配。在Android studio中进行测试


通过单元测试,您可以在应用程序中获取一小部分代码,例如方法或类,并将其与应用程序的其余部分隔离,以便您编写的测试确保一小部分代码在你期望的方式。通常,单元测试会调用具有各种不同输入的方法,并验证该方法是否符合您的期望并返回您期望它返回的内容。
为add()方法添加更多测试
@Test
public void addTwoNumbersNegative() {
double resultAdd = mCalculator.add(-1d,2d);
assertThat(resultAdd,is(equalTo(1d)));
}
运行

-1 + 2 = 1
为浮点数添加一个新的单元测试
@Test
public void addTwoNumbersFloats() {
double resultAdd = mCalculator.add(1.111f,1.111f);
assertThat(resultAdd,is(equalTo(2.222d)));
}
运行
测试未通过,说明浮点数运算错误了

浮点数的算术是不精确的,并且提升导致了额外精度的副作用。测试中的断言在技术上是错误的:预期值不等于实际值。
设置足够接近就算正确,使用closeto

这样就通过了
使用closeTo()匹配器,您可以测试特定增量内的相等性,而不是测试完全相等。在这种情况下,closeTo()matcher 方法有两个参数:期望值和增量量。在上面的示例中,该增量只是两个小数点的精度。
为其他计算方法添加单元测试
这就同理了

Android Studio 具有运行本地单元测试的内置功能:
(test)Android Studio Project > Android窗格中的文件夹中。org.junit、org.hamcrest和android.test.@RunWith(JUnit4.class)注释告诉测试运行器在这个类中运行测试。@SmallTest, @MediumTest, 和@LargeTest注解是更容易捆绑相似的测试组的约定@SmallTest所有测试都是单元测试,没有依赖关系,并且以毫秒为单位运行。捆绑相似的测试组的约定
@SmallTest所有测试都是单元测试,没有依赖关系,并且以毫秒为单位运行。