Как создать набор тестов для 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 и функциональными тестами с использованием инструментальной системы. Его документация теперь четко объясняется здесь. Эти ссылки могут помочь вам начать тестирование:

Введение в структуру и все связанные классы:

Список этих классов:

Пример тестирования: