Как создать набор тестов для Android, который запускает только определенные тесты в одном или нескольких классах?
Может кто-то пролить свет на то, как организовать тесты в тестовых наборах, используя JUnit в Android? Я нахожу почти все примеры неработоспособными, и мне интересно, что это такое, чего я не получаю.
Я сделал небольшой пример с классом AndroidTestCase, содержащим несколько тестов, и набором тестов, который включает все тесты в пакете. Это работает (по-видимому):
Класс тестового примера, содержащий тесты:
public class ArithmeticsTest extends AndroidTestCase {
SomeClass sctest;
protected void setUp () throws Exception {
sctest = new SomeClass();
super.setUp();
}
/* Test the SomeClass.addNumbers (int, int) method: */
public void testAddNumbers () {
assertEquals(9, sctest.addNumbers(3, 6));
}
/* Test the SomeClass.addNumbers (int, int) method: */
public void testSubtractNumbers () {
assertEquals(2, sctest.subtractNumbers(6, 4));
}
protected void tearDown () throws Exception {
super.tearDown();
}
}
Класс тестового набора, включающий все тесты в пакете:
import junit.framework.Test;
import android.test.suitebuilder.TestSuiteBuilder;
public class ProjectTestSuite_AllTests {
public static Test suite () {
return new TestSuiteBuilder(ProjectTestSuite_AllTests.class)
.includeAllPackagesUnderHere()
.build();
}
}
Как уже упоминалось, это работает. Однако, если у меня много тестовых примеров, как классы с несколькими тестами, так и другие классы с другими тестами (имеет смысл организовать различные типы тестов, imo), тогда я бы хотел создать тестовые пакеты, которые включают конкретные тесты для конкретных классы и т.д., поэтому их можно запускать исключительно.
Я видел примеры на этом, но я не получил никого, чтобы работать. У кого-нибудь есть хороший пример? То есть новый набор тестов, который включает конкретные тестовые примеры из одного или нескольких классов тестовых примеров.
Update:
Следующие два примера работают:
Запустите все тесты в пакете:
public static Test suite () {
return new TestSuiteBuilder(ProjectTestSuite_AllTests.class)
.includeAllPackagesUnderHere()
.build();
}
Запустите все тесты в определенном классе тестов (класс AndroidTestCase):
public static Test suite () {
Class testClass = ArithmeticsTests.class;
TestSuite suite = new TestSuite(testClass);
return suite;
}
Однако это НЕ работает:
public static Test suite () {
TestSuite suite= new TestSuite();
suite.addTest(new ArithmeticsTest("testAddNumbers"));
suite.addTest(new ArithmeticsTest("testSubtractNumbers"));
return suite;
}
Последний (нерабочий) пример - от developer.android.com. Ошибка, которую я получаю при попытке:
Конструктор ArithmeticsTests (String) - undefined
Что странно, так как я не пытаюсь получить доступ к конструктору, но назову конкретный тестовый метод в классе тестового примера (testAddNumbers).
ОБНОВЛЕНИЕ 11 января:
Здесь класс тестового примера содержит пару тестов:
public class ArithmeticsTests extends AndroidTestCase {
SomeClass sctest;
protected void setUp () throws Exception {
sctest = new SomeClass();
super.setUp();
}
public void testAddNumbers () {
assertEquals(9, sctest.addNumbers(3, 6));
}
public void testSubtractNumbers () {
assertEquals(2, sctest.subtractNumbers(6, 4));
}
protected void tearDown () throws Exception {
super.tearDown();
}
}
И вот класс тестового набора, в который я пытаюсь включить (f.ex.) ОДИН из тестов в вышеуказанном классе:
public class ProjectTestSuite_SomeTests {
public static Test suite () {
// This does not work:
TestSuite suite= new TestSuite();
suite.addTest(new ArithmeticsTests("testAddNumbers"));
return suite;
}
}
В строке AddTest приведена следующая ошибка:
Конструктор ArithmeticsTests (String) - undefined
Здесь файл SomeClass, который я пытаюсь проверить в этом примере:
public class SomeClass {
int classInt;
String classString;
Item item;
public SomeClass () {}
public SomeClass (int ci, String cs) {
this.classInt = ci;
this.classString = cs;
}
public int addNumbers (int num1, int num2) {
return num1+num2;
}
public int subtractNumbers (int num1, int num2) {
return num1-num2;
}
}
Ответы
Ответ 1
Проблема AFAIK заключается в том, что класс AndroidTestCase имеет только один конструктор - AndroidTestCase()
Задание тестовых примеров с использованием строки поддерживается только классом TestCase для JUnit, но не для AndroidTestCase(). Вот почему вы столкнулись с этой проблемой.
Ответ 2
Для запуска только подмножества тестовых функций ваш метод пакета выглядит следующим образом:
public static Test suite () {
final TestSuite suite = new TestSuite();
suite.addTest(TestSuite.createTest(ArithmeticsTests.class, "testAddNumbers"));
suite.addTest(TestSuite.createTest(ArithmeticsTests.class, "testSubtractNumbers"));
// add some more tests here or comment out one of the lines above
// if you want to skip a particular test
return suite;
}
Метод createTest не кажется хорошо документированным, но он работает для меня:
http://developer.android.com/reference/junit/framework/TestSuite.html#createTest (java.lang.Class, java.lang.String)
Ответ 3
может добавлять разные тестовые классы:
Class[] testClasses = { MathTest.class, AnotherTest.class }
TestSuite suite= new TestSuite(testClasses);
TestSuite suite= new TestSuite();
suite.addTest(new MathTest("testAdd"));
suite.addTest(new MathTest("testDivideByZero"));
TestSuite suite= new TestSuite(MathTest.class);
Ссылка
С Android Unit и функциональными тестами с использованием инструментальной системы. Его документация теперь четко объясняется здесь. Эти ссылки могут помочь вам начать тестирование:
Введение в структуру и все связанные классы:
Список этих классов:
Пример тестирования:
Ответ 4
Я нашел обходное решение для достижения желаемого.
Проверьте это: Android TestSuite: включите все тестовые приложения, кроме некоторых явно определенных