Тестирование GPS в Android
Как вы тестируете GPS-приложения в Android? Можем ли мы проверить это с помощью эмулятора Android?
6 ответов
Да.
Если вы разрабатываете с использованием плагина Eclipse ADT, откройте перспективу DDMS после запуска эмулятора и найдите представление управления эмулятором. Существует раздел управления местоположением, который позволяет отправлять фиксированные координаты широты и долготы или файлы GPX (формат обмена GPS) или KML (язык разметки замочных скважин), если вы хотите отправлять несколько координат через равные промежутки времени (для имитации путешествия по определенному маршруту),
Кроме того, вы можете просто подключиться к эмулятору и использовать команду 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 это sulotion для фиктивного местоположения в дополнение к реальному местоположению GPS: 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);
}
}
}
надеюсь, это поможет вам
В элементах управления Extended вашего эмулятора (нажмите "..." на панели управления рядом с вашим эмулятором) есть вкладка Location, где вы можете либо вручную ввести отдельные местоположения (широта / долгота / высота) и отправить их в виртуальный устройства или настройте воспроизведение данных GPS на нужной скорости из файла GPX или KML, который вы можете импортировать.
Изменить: это эмулятор Android по умолчанию, о котором я говорю.
Я предлагаю вам написать тест, который отправляет объект местоположения в класс слушателя, которого вы хотите протестировать. Имея это в виду, вам понадобятся некоторые вспомогательные методы, которые смогут создавать объекты местоположения.
Например:
Сначала вы отправляете местоположение с фиксированными координатами (например, центр Нью-Йорка).
// проверить, все ли в порядке
Затем вы отправляете координату, которая находится на расстоянии 100 м от первой координаты. Вы можете сделать это с помощью функции, которую я недавно внедрил: /questions/12236359/opredelit-geopoint-ot-drugogo-rasstoyanie-i-polyarnyij-ugol/12236374#12236374
// проверить, все ли в порядке
Обычно методы GPS связаны со временем. Я предлагаю вам реализовать метод getNow() в классе слушателя и вызывать его всякий раз, когда вам нужно текущее время.
long getNow() {
if (isUnitTesting) {
return unitTestTime;
} else {
System.getcurrenttimemillis();
}
}
В среде модульного тестирования вы просто устанавливаете obj.isUnitTesting=true и obj.unitTestTime в любое время. После этого вы можете отправить первое местоположение слушателю, затем вы меняете время (+x секунд) и отправляете другое местоположение...
Так будет намного проще протестировать ваше приложение.