10

我想创建一个单元测试来验证 API 是否成功获取了 Repos 列表。我希望测试实际上建立网络连接而不是使用模拟服务器。而且,例如使用 RoboElectric 会很好,这样测试就可以在 JVM 上运行。

这是为了从 MVP 架构测试模型。

我正在使用 Mosby 的示例项目,它使用 Dagger 2 和 Retrofit 1.9。

public interface GithubApi
{
    @GET("/repositories")
    @Headers("Cache-Control: no-cache")
    public void getRepos(Callback<List<Repo>> callback);
}

这是模块:

@Module()
public class SampleModule
{
    @Provides @Singleton public GithubApi providesGithubApi()
    {
        OkHttpClient client = new OkHttpClient();
        client.setCache(new Cache(context.getCacheDir(), 10 * 1024 * 1024));

        RestAdapter restAdapter = new RestAdapter.Builder()
            .setClient(new OkClient(client))
            .setEndpoint("https://api.github.com")
            .build();

        return restAdapter.create(GithubApi.class);
    }
}
4

2 回答 2

29

你真正想测试什么?我问是因为您似乎不清楚您真正想要什么:

  • 测试 API?提供完整的 API 是后端的工作。
  • 测试您的应用程序是否正确进行 http 通信?这听起来你想测试改造。但改造已经过测试。您可以假设改造工作有效,您不必再次对其进行测试。
  • 测试 json 是否被正确解析?这已经由改造内部使用的杰克逊或 gson 完成。同样,无需再次测试。

所以仍然是同一个问题:您实际上想在“模型”(MVP 中的业务逻辑层)上测试什么?如果改造是您的整个业务逻辑,则可以测试以下内容(如上所述尚未由外部库测试):

  • 您的 POJO 类是否正确注释,以便 gson / jackson 正确反序列化从 Github API 接收的 json。怎么做?在这种情况下,您需要可靠的模拟数据并且不能使用实时 API。在这种情况下,您必须模拟服务器响应。否则您无法编写单元测试,因为如果您明天再次运行测试,GithubApi 将返回不同的数据。
  • 您可以测试您是否在应用程序中正确处理了所有 http 响应代码。但是,您还必须模拟 Github API,否则您无法模拟 Github API 返回 404 响应或 401 等。

如果您的模型只是改造,那么这就是您可以为单元测试“模型”编写的单元测试。

我希望测试实际上建立网络连接而不是使用模拟服务器。

我希望您现在明白需要 MockServer。

否则听起来你想编写一种集成测试。但同样,您实际上想用该集成测试来测试什么?

在我看来,您似乎只是想确保您的应用在从 GithubAPI 加载数据并在 UI 中滚动项目列表时不会崩溃,对吗?

所以这样的“集成测试”可以用 Robolectric 和 Espresso 编写。但是,这实际上不是测试!你assertEquals()在这样的测试中有什么等吗?所以这是一个非常愚蠢的测试,因为除了您的应用程序没有崩溃之外,您无法验证任何内容。如果这是您正在寻找的内容,请继续为您的活动编写一个 Espresso 测试,该测试加载实时数据并一直向下滚动您的 recyclerview 直到结束。但实际上,您几乎没有通过这样的测试涵盖任何内容。它不可靠,不可复制,并且仅验证您的应用程序没有在“快乐路径”中崩溃。但这与启动应用程序时手动执行此操作非常相似。

所以问问自己:我想测试什么?我实际上应该测试什么?如前所述,测试改造没有意义,因为它已经通过平方测试。测试滚动 RecyclerView 的工作也没有意义,因为 UI 小部件 RecyclerView 已经在 android 框架内部进行了测试。

于 2016-01-26T12:58:45.727 回答
1

您要搜索的关键字是集成测试。集成测试总是很棘手(因为您依赖于 Internet 连接,所以测试可能很不稳定),我建议您在完成所有单元和 UI 测试之后再进行测试。以下是两个可能对您有用的链接:

于 2016-01-25T22:58:45.707 回答