Как создать Android Test suite, который выполняет только определенные тесты в одном или нескольких классах?
Может ли кто - нибудь пролить свет на то, как организовать тесты в тестовых наборах, используя 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), то я хотел бы создать наборы тестов, которые включают в себя конкретные тесты для конкретных классов и т. д., чтобы их можно было запускать исключительно.
Я видел примеры на этот счет, но я никого не заставлял работать. У кого-нибудь есть хороший пример? То есть новый набор тестов, который включает в себя конкретные тестовые случаи из одного или нескольких классов тестовых случаев.
Обновление:
Работают следующие два примера:
Выполните все тесты в пакете:
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) является неопределенный
Что странно, так как я не пытаюсь получить доступ к конструктору, а называю конкретный метод тестирования в классе test case (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();
}
}
А вот класс test suite, в который я пытаюсь включить (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) не определен
Вот файл 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;
}
}
4 ответов:
Проблема AFAIK заключается в том, что класс AndroidTestCase имеет только один конструктор-AndroidTestCase ()
Указание тестовых случаев с помощью строки поддерживается только классом TestCase JUnit, но не AndroidTestCase (). Вот почему вы столкнулись с этой проблемой.
Чтобы запустить только подмножество тестовых функций, сделайте свойsuite метод следующим образом:
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 Ява.яз..Строка)
Можно добавлять различные тестовые классы с помощью:
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 с использованием инструментария. Его документация теперь ясно объяснена здесь, эти ссылки могут помочь вам начать тестирование:
Я нашел обходной путь, чтобы достичь того, что вы хотите.
Проверьте это: Android TestSuite: включить все тестовые наборы, кроме некоторых явно определенных
Comments