Androidで GPS アプリケーションをどのようにテストしますか? Android エミュレーターを使用してテストできますか?
6 に答える
はい。
Eclipse ADT プラグインを使用して開発する場合は、エミュレーターの起動後に DDMS パースペクティブを開き、Emulator Control ビューを探します。一定の間隔で複数の座標を送信する場合は、緯度と経度の固定座標、または GPX (GPS Exchange Format) または KML (Keyhole Markup Language) ファイルを送信できる位置制御セクションがあります (特定のルートの移動をシミュレートするため)。 .
または、エミュレーターに telnet で接続し、コマンド ラインから geo コマンドを使用することもできます。これは、固定された緯度と経度の座標と NMEA データ センテンスをサポートします。
telnet localhost 5554
geo fix -82.411629 28.054553
geo nmea $GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B
単体テストを使用したい場合は、これを試すことができます。
public class GPSPollingServiceTest extends AndroidTestCase {
private LocationManager locationManager;
public void testGPS() {
LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE);
locationManager.addTestProvider("Test", false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled("Test", true);
// Set up your test
Location location = new Location("Test");
location.setLatitude(10.0);
location.setLongitude(20.0);
locationManager.setTestProviderLocation("Test", location);
// Check if your listener reacted the right way
locationManager.removeTestProvider("Test");
}
}
これを機能させるには、AndroidManifest.xml に対する必要なアクセス許可も必要です。
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
Mallox コードに加えて、これは実際の gps 位置に加えてモック位置の sulotion です: TEST_MOCK_GPS_LOCATION は文字列です
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location location = null;
List providers = lm.getAllProviders();
for (Object provider : providers) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Location loc = lm.getLastKnownLocation((String) provider);
if (provider.equals(TEST_MOCK_GPS_LOCATION)) {
mLastLocation = loc;
}
}
テストクラスでは次のとおりです。
public class GPSPollingServiceTest extends AndroidTestCase {
private LocationManager locationManager;
public void testGPS() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE);
List providers = locationManager.getAllProviders();
if(!providers.contains(TEST_MOCK_GPS_LOCATION)) {
locationManager.addTestProvider(TEST_MOCK_GPS_LOCATION, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled(TEST_MOCK_GPS_LOCATION, true);
// Set up your test
Location location = new Location(TEST_MOCK_GPS_LOCATION);
location.setLatitude(34.1233400);
location.setLongitude(15.6777880);
location.setAccuracy(7);
location.setTime(8);
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
locationManager.setTestProviderLocation(TEST_MOCK_GPS_LOCATION, location);
Method locationJellyBeanFixMethod = Location.class.getMethod("makeComplete");
if (locationJellyBeanFixMethod != null) {
locationJellyBeanFixMethod.invoke(location);
}
} else {
// Check if your listener reacted the right way
locationManager.removeTestProvider(TEST_MOCK_GPS_LOCATION);
}
}
}
それがあなたを助けることを願っています
テストしたいリスナークラスに位置オブジェクトを送信するテストを書くことをお勧めします。これを念頭に置いて、位置オブジェクトを生成できるいくつかのヘルパー メソッドが必要になります。
例えば:
まず、固定座標 (ニューヨークの中心など) で場所を送信します。
// すべてが OK かどうかをテストします
最初の座標から 100m 離れた座標を送信します。最近実装した関数でこれを行うことができます: https://stackoverflow.com/a/17545955/322791
// すべてが OK かどうかをテストします
GPS 方式が時間に関連していることは一般的です。getNow() メソッドをリスナー クラスに実装し、現在の時刻が必要なときに呼び出すことをお勧めします。
long getNow() {
if (isUnitTesting) {
return unitTestTime;
} else {
System.getcurrenttimemillis();
}
}
単体テスト環境では、obj.isUnitTesting=true と obj.unitTestTime を任意の時間に設定するだけです。その後、最初の場所をリスナーに送信してから、時間を変更して (+x 秒)、別の場所を送信します ...
そうすれば、アプリケーションのテストがはるかに簡単になります。