9

Jeden z moich inżynierów ds. Kontroli jakości obsługuje aplikację z dość dużym zakresem kodu i wieloma różnymi plikami SharedPreferences. Pewnego dnia przyszedł do mnie z pytaniem, jak zresetować stan aplikacji między testami, jakby został odinstalowany - ponownie zainstalowany.Resetuj stan aplikacji między InstrumentationTestCase działa

Wygląda na to, że nie jest obsługiwane przez Espresso (którego używa) ani przez ramy testowe Android natywnie, więc nie jestem pewien, co mu powiedzieć. Posiadanie natywnej metody czyszczenia wszystkich plików SharedPreferences byłoby dość kruchym rozwiązaniem.

W jaki sposób można zresetować stan aplikacji podczas oprzyrządowania?

Odpowiedz

15

Obecne espresso nie zapewnia żadnego mechanizmu resetowania stanu aplikacji. Ale dla każdego aspektu (pref, db, pliki, uprawnienia) istnieją rozwiązania.

Na wstępie należy unikać tego, że espresso rozpoczyna swoją czynność automatycznie, aby mieć wystarczająco dużo czasu na zresetowanie.

@Rule 
public ActivityTestRule<Activity> activityTestRule = new ActivityTestRule<>(Activity.class, false, false); 

A później rozpocząć swoją działalność z

activityTestRule.launchActivity(null) 

Dla resetowanie preferencji można użyć następującego fragmentu (przed rozpoczęciem działalności)

File root = InstrumentationRegistry.getTargetContext().getFilesDir().getParentFile(); 
String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list(); 
for (String fileName : sharedPreferencesFileNames) { 
    InstrumentationRegistry.getTargetContext().getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit(); 
} 

po rozpoczęciu aktywności zbyt Można przywrócić preferencje . Ale wtedy działanie mogło już odczytać preferencje.

Twoja klasa aplikacji jest uruchamiana tylko raz i jest już uruchomiona, zanim zresetujesz preferencje.

Zacząłem pisać bibliotekę, która sprawi, że testowanie będzie prostsze dzięki espresso i uiautomator. Obejmuje to oprzyrządowanie do resetowania danych aplikacji. https://github.com/nenick/espresso-macchiato Zobacz na przykład EspAppDataTool z metodami czyszczenia preferencji, baz danych, buforowanych plików i przechowywanych plików.

+0

Projekt wykorzystuje wiele różnych plików SharedPreferences. Tak jak powiedziałem, posiadanie natywnej metody czyszczenia wszystkich plików SharedPreferences byłoby dość kruchym rozwiązaniem. :( – Turnsole

+0

Jest równy, jeśli masz jeden lub 9999 tausend SharedPreferences.Zazwyczaj są one zlokalizowane w shared_prefs. Czego jeszcze można się spodziewać? Alternatywnie można napisać skrypt, aby uruchomić tylko każdy test, między każdym testem jasne dane aplikacji z adb a następnie rozpocznij następny test – nenick

+1

O! Widzę, co tam zrobiłeś. Przeczytałem to zbyt szybko i uznałem, że "shared_prefs" było skrótem dla twojego_pliku_pliku_pliku, ale jest to dosłownie folder główny plików SharedPreferences. – Turnsole

0

Ulepszanie rozwiązania @ nenick, obejmuje zachowanie usuwania stanu w niestandardowym ActivityTestRule. Jeśli to zrobisz, możesz zezwolić, aby test kontynuował automatyczne uruchamianie działania bez interwencji użytkownika. Z niestandardowym ActivityTestRule, aktywność jest już w pożądanym stanie po uruchomieniu do testu.

Poniżej znajduje się jeden z nich, który został wdrożony w celu upewnienia się, że aplikacja jest wylogowywana podczas uruchamiania danej aktywności, na jeden test. Niektóre testy zakończone niepowodzeniem pozostawiały aplikację w stanie zalogowania. To spowodowałoby również, że późniejsze testy również się nie powiodły, ponieważ późniejsze zakładały, że będą musiały się zalogować, ale aplikacja będzie już zalogowana.