#android #unit-testing #android-gradle-plugin
#Android #модульное тестирование #android-gradle-plugin
Вопрос:
Я хочу начать писать модульные тесты для своих приложений, но я не могу запустить один простой тест. Я создал небольшое приложение, просто чтобы попробовать, как следует настроить и запустить модульный тест, но на самом деле тест не выполняется, и я получаю «Пустой набор тестов».
Я использую Android Studio 0.6.1 с gradle 1.12
Вот моя структура папок:
MyActivityTest.java
package com.vist.testableapp.tests;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.widget.Button;
import com.vist.testableapp.MyActivity;
import com.vist.testableapp.R;
public class MyActivityTest extends ActivityUnitTestCase<MyActivity>
{
public MyActivityTest(Class<MyActivity> activityClass)
{
super(activityClass);
}
Button btn1;
@Override
public void setUp() throws Exception
{
super.setUp();
startActivity(new Intent(getInstrumentation().getTargetContext(), MyActivity.class), null, null);
btn1 = (Button)getActivity().findViewById(R.id.button1);
}
@SmallTest
public void testFirst()
{
assertEquals("Btn1",btn1.getText());
}
}
build.gradle приложения
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "com.vist.testableapp"
minSdkVersion 15
targetSdkVersion 15
versionCode 1
versionName "1.0"
testApplicationId "com.vist.testableapp.tests"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
Может ли кто-нибудь указать, что я делаю не так или чего мне не хватает?
Я искал в SO, но ни один из ответов мне не помог.
Ответ №1:
Конструктор должен выглядеть следующим образом:
public MyActivityTest()
{
super(MyActivity.class);
}
Мне нужно будет научиться не так сильно полагаться на шаблон кода IDE, который предоставил конструктору параметр.
Это было решено благодаря коллеге и http://siemprepreguntando.blogspot.de/2013/07/running-tests-test-running-startedtest.html
Ответ №2:
Недавно я также столкнулся с проблемой «пустой набор тестов». После проверки нескольких похожих вопросов и ответов и моей проблемы я могу сделать вывод, что проблема возникает из-за ошибки, препятствующей добавлению тестов в набор тестов, такой как ошибка статической инициализации.
Например, я использую популярный подход к добавлению всех тестов, как показано ниже, но это тот же сценарий с разными подходами к добавлению тестовых примеров в набор:
public class FullTestSuite extends TestSuite {
public static Test suite() {
return new TestSuiteBuilder(FullTestSuite.class)
.includeAllPackagesUnderHere().build();
}
public FullTestSuite() {
super();
}
}
И, по-видимому, в моем тестовом файле возникла проблема в статическом блоке {}, которая не позволила .includeAllPackagesUnderHere() успешно выполнить.
Поэтому я бы посоветовал всем, кто сталкивается с этой ошибкой, сначала проверить журналы вашего приложения, чтобы узнать, не возникает ли в вашем тесте проблема, препятствующая добавлению тестовых примеров в набор тестов (например, аналогичные примеры неправильного вызова конструктора или проблемы со статической инициализацией).
Ответ №3:
В моем случае сообщение «пустой набор тестов» было напрямую связано с целевым уровнем API эмулятора Android, который я запускал. Я настроил эмулятор с уровнем API 19 и использовал его при попытке запустить мои инструментальные тесты. Я также совсем недавно перенес свою кодовую базу для использования JUnit4 framework вместе с инструментарием AndroidJUnitRunner.
Я некоторое время бился головой о стену, прежде чем начал изучать проблемы с самим эмулятором. Конечно же, как только я настроил эмулятор с уровнем API 23, тесты начали работать нормально.
Дальнейшие эксперименты показали, что мои тесты отлично работали на эмуляторах уровня API 22 и 23, но не на чем-либо ниже этого. Я подозреваю, что это как-то связано с моими тестовыми зависимостями и минимальными требованиями к уровню API.
Я обновлю этот ответ, если узнаю больше.