如何测试 Evernote 的 Android 作业?

How to test Evernote's Android Jobs?

如何测试使用 Android-Job 库创建的作业?任何关于单元测试、仪器测试甚至手动测试的想法都值得赞赏,我只是想检查它是否按预期工作。

具体来说,我有一个每 N 小时执行一次 HTTP 请求的作业:

package com.kondenko.yamblzweather.job;


import android.support.annotation.NonNull;

import com.evernote.android.job.Job;
import com.evernote.android.job.JobRequest;
import com.kondenko.yamblzweather.model.entity.WeatherData;
import com.kondenko.yamblzweather.ui.weather.WeatherInteractor;
import com.kondenko.yamblzweather.utils.SettingsManager;

import java.util.concurrent.TimeUnit;

import javax.inject.Inject;

public class UpdateWeatherJob extends Job {

private WeatherInteractor interactor;
private String cityId;
private String units;
private long refreshRateHr;

// Do not delete, needed for job creation
public static final String TAG = "UpdateWeaterJob";

@Inject
public UpdateWeatherJob(WeatherInteractor interactor, SettingsManager settingsManager) {
    this.interactor = interactor;
    this.cityId = settingsManager.getSelectedCity();
    this.units = settingsManager.getSelectedUnitValue();
    this.refreshRateHr = settingsManager.getRefreshRate();
}

@NonNull
@Override
protected Result onRunJob(Params params) {
    WeatherData data = interactor.getWeather(cityId, units).blockingGet();
    return data != null ? Result.SUCCESS : Result.FAILURE;
}


public void buildJobRequest(String name) {
    new JobRequest.Builder(UpdateWeatherJob.TAG)
            .setPeriodic(TimeUnit.HOURS.toMillis(refreshRateHr))
            .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
            .setRequirementsEnforced(true)
            .setPersisted(true)
            .build()
            .schedule();
}

}

我们在 Evernote 通过以下方式测试作业:

  • 单元测试 -> 我们倾向于将逻辑提取到操作中,类似于 MVP 设置中的演示者。这会删除 Android 依赖项并且操作是可单元测试的。
  • QA -> 我们有 QA 选项来手动触发作业。这样我们的 QA 团队就可以验证作业是否产生了正确的输出
  • 验证时间 -> 我们依赖日志。

你也应该看看 these slides。 ADB 可以真正帮助验证窗帘假设。