Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Тестирование Android JUnit

Решил разабраться, что же такое тестирование. Пару статей на хабре, в Intellij Idea через Maven подключил JUnit, посмотрел примеры, написал пару тестовых методов с аннотацией @Test - все работает.
Потом решил на примере тестового приложения Android сделать то же самое:
в build.gradle (Module:app) добавил зависимость
dependencies {
testCompile 'junit:junit:4.12'
} скачал и подключил библеотеку junit-4.10.jar написал такой тест
import android.test.ActivityTestCase;
import junit.framework.Assert;
public class ChronometrTest extends ActivityTestCase {
public void testOne(){ System.out.println(":::::::::::::::::::::testOne() start.. "); Assert.assertTrue(true); }
}
жму правой кнопкой Run/ JUnit test, вот что я получаю в ответ:
Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:260) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122) Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 3 more
*Android studio v1.2.2
Вопрос: чего я не сделал, или сделал, но не так?


Ответ

Актуально для Android studio
Для написания Unit тестов использую Robolectric и JUnit4. Robolectric нужен для получения доступа к специфическим для Andoird компонентам, например Context
Для использования JUnit4 и Robolectric надо дописать в build.gradle
testCompile 'junit:junit:4.12' testCompile "org.mockito:mockito-core:1.9.5" testCompile "org.robolectric:robolectric:3.0"
После чего создать папку test рядом с папкой main, должна получится примерно следующая структура:
app\src\main\ app\src\test\
В папке test лучше создать такую же структуру пакетов, как и в папке main. Хочу заметить что если в обозревателе проектов выбран тип Android, то папка test не будет видна. Необходимо переключить на тип Project. Так же чтобы все Robolectric и JUnit4 классы были доступны необходимо переключить Test Artifact в BuldVariant на Unit Test

После чего можно начать писать сами тесты. Тестовый класс должен иметь следущющую структуру:
@RunWith(RobolectricTestRunner.class) @SmallTest public class SomeTestClass {
@Test public void someTest(){ // код, тестирующий что либо }
//остальные тесты }
Для запуска необходимо создать JUnit конфигурацию и запускать ее, либо через командую строку. Все юнит тесты будут запускать локально, т.е нет необходимости подключать телефон или запускать эмулятор.
UPD: если переключить Test Artifact на Unit Test, то папка test будет видна в типе проекта Android

Комментариев нет:

Отправить комментарий