2012-03-01 5 views
18

Piszę testy dla komponentu w mojej aplikacji na Androida. Ten komponent wykorzystuje działania do tworzenia raportów. Potrzebuję więc działania w celu przetestowania komponentu (brzydka architektura) i pomyślałem, że łatwo będzie stworzyć fikcyjną aktywność w projekcie testowym, a następnie utworzyć testy odziedziczone po ActivityInstrumentationTestCase2<TestActivity>, ale z jakiegoś powodu zawsze otrzymuję wyjątek java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=com.xxx/.Testctivity }.Czy można zdefiniować działanie w projekcie testowym systemu Android i przeprowadzić test przeciwko niemu?

Aktywność testowa jest dodawana do pliku manifestu, a pakiet wydaje się poprawnie ustawiony.

Próbowałem umieścić go w pakietach com.xxx (pakiet aplikacji) i com.xxx.test, bez powodzenia. Ale kiedy przenosimy TestActivity do docelowej aplikacji, wszystko działa dobrze. Zacząłem się zastanawiać, jaka jest różnica między projektem testowym a moją aplikacją i czy możliwe jest nawet wykonywanie działań w testowych projektach.

Odpowiedz

9

Tak, to jest możliwe, ale nie zalecane, gdyż stwierdzono w official dev guide:

Po utworzeniu projektu testowego zapełnisz go pakietem testowym. Ten pakiet nie wymaga działania, ale możesz go zdefiniować, jeśli chcesz. Chociaż Twój pakiet testowy może łączyć klasy aktywności, klasy przypadków testowych lub zwykłe klasy, Twój główny przypadek testowy powinien rozszerzyć jedną z klas przypadków testowych Androida lub klas JUnit, ponieważ zapewniają one najlepsze funkcje testowania.

W tym celu potrzebne są:

  1. Zdefiniuj atrapę aktywność w AndroidManifest.xml Projektu test.
  2. Zmień punkt docelowy oprzyrządowania w teście Project AndroidManifest.xml. (badana klasa aktywności musi pod opcją instrumentationPackage).

Załóżmy, że mam projekt testowy com.example.test zawierać dwie klasy DummyActivity i DummyActivityTest, a następnie, jeśli chcesz testowy DummyActivity użyciu DummyActivityTest, trzeba zdefiniować AndroidManifest.xml swój projekt Sprawdźmy jak to:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<uses-sdk android:minSdkVersion="10" /> 

<!-- targetPackage point to test project itself --> 
<instrumentation 
    android:name="android.test.InstrumentationTestRunner" 
    android:targetPackage="com.example.test" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <uses-library android:name="android.test.runner" /> 
    <activity 
     android:name=".DummyActivity" 
     android:label="@string/app_name" > 
    </activity> 
</application> 

+0

Kiedy zmienię targetPackage na self , zaczyna się nie udać z NoSuchMethodException na InstrumentationTestRunner.onCreate – basin

+0

Miałem problemy z tym podejściem; Myślę, że jeśli pakiet/manifest/@ jest taki sam jak/manifest/instrumentation/@ android: targetPackage, testy skutecznie zastąpią testowaną aplikację, uniemożliwiając odniesienie do jej klas. Otrzymywałem ClassNotFoundExceptions. –

+1

Mam pracę z tym podejściem, dodając dodatkowy AndroidManifest.xml w katalogu androidTest. Ale w nowszej wersji Androida Studio, od wersji 2.3.1 używam teraz, element '' nie jest potrzebny. –

0

Projekt badania i działalność mogą współistnieć razem, umieścić nazwę pakietu docelowy jako nazwę pakietu projektu testowego

+0

Dziękuję za odpowiedź. Próbowałem, jak zaproponowałeś, ale teraz dostaję java.lang.RuntimeException: wyjątek podczas tworzenia pakietu w android.test.suitebuilder.TestSuiteBuilder $ FailedToCreateTests.testSuiteConstructionFailed (TestSuiteBuilder.java:239) – Fedor

Powiązane problemy