2013-05-26 19 views
16

Mam kod, który chcę przetestować. Chcę sprawdzić, czy String jest poprawnie skomponowany z różnych ciągów, które mam w zasobach. Wyzwanie polega na tym, że mam do czynienia z wieloma tłumaczeniami w moich zasobach. Wiem, że locale może stanowić problem podczas testowania aplikacji na komputer i zaleca się tworzenie testów niezależnych od ustawień lokalnych.Ustawienia regionalne podczas testu urządzenia na Androidzie

Odkryłam, że można ustawić locale programowo, ale to nie było zalecane (patrz Change language programmatically in Android). Podczas gdy to pytanie ma na celu zmianę ustawień regionalnych w czasie wykonywania podczas normalnej pracy aplikacji, zastanawiałem się, czy istnieje lepsze rozwiązanie mojego problemu.

+0

Jestem również zainteresowany tym, stąd bounty. Moja specyfikacja: testuję z poziomu Eclipse i chciałbym móc zmienić ustawienia regionalne, w tym strefę czasową, tak płynnie, jak to możliwe, w ramach pakietu. Chciałbym zobaczyć działający przykład, jak to zrobić w odpowiedzi. –

+0

@MattGibson Zaktualizowałem swoją odpowiedź na przykładzie roboczym. Zmienia ustawienia regionalne zarówno dla formatów daty, jak i zasobów aplikacji. –

Odpowiedz

37

Jeśli to tylko do testowania, można zmienić ustawienia regionalne programowo bez żadnych problemów. Zmieni to konfigurację Twojej aplikacji i będziesz mógł przetestować swój kod za pomocą nowych ustawień narodowych. Ma taki sam efekt, jak gdyby użytkownik go zmienił. Jeśli chcesz zautomatyzować testy, możesz napisać skrypt, który zmienia ustawienia narodowe za pomocą adb shell jako described here, a następnie uruchomić testy.

Oto przykład testowania tłumaczenia słowa "Anuluj" dla języka angielskiego, niemieckiego i hiszpańskiego lokalizacjach:

public class ResourcesTestCase extends AndroidTestCase { 

    private void setLocale(String language, String country) { 
     Locale locale = new Locale(language, country); 
     // here we update locale for date formatters 
     Locale.setDefault(locale); 
     // here we update locale for app resources 
     Resources res = getContext().getResources(); 
     Configuration config = res.getConfiguration(); 
     config.locale = locale; 
     res.updateConfiguration(config, res.getDisplayMetrics()); 
    } 

    public void testEnglishLocale() { 
     setLocale("en", "EN"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Cancel", cancelString); 
    } 

    public void testGermanLocale() { 
     setLocale("de", "DE"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Abbrechen", cancelString); 
    } 

    public void testSpanishLocale() { 
     setLocale("es", "ES"); 
     String cancelString = getContext().getString(R.string.cancel); 
     assertEquals("Cancelar", cancelString); 
    } 

} 

Oto wyniki wykonania w Eclipse:

enter image description here

Androida O aktualizacja.

W przypadku używania w systemie Android należy użyć metody Locale.setDefault(Category.DISPLAY, locale) (więcej szczegółów można znaleźć w artykule behaviour changes).

+2

Dzięki! Powinno to zapewnić przyszłym użytkownikom lepszy punkt wyjścia do testowania ustawień regionalnych. –

+1

Nie przedłużam testów w AndroidTestCase, więc nie mogę uzyskać kontekstu. Używam '@RunWith (RobolectricGradleTestRunner.class). Wygląda więc na to, że nie mogę użyć tego samego rozwiązania. Jakakolwiek rada? –