如何测试 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 可以真正帮助验证窗帘假设。
如何测试使用 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 可以真正帮助验证窗帘假设。