Как создать набор тестов 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();
    }
}

Как уже упоминалось, это работает. Однако, если у меня есть много тестовых случаев, как классов с несколькими тестами, так и других классов с другими тестами (есть смысл организовать разные типы тестов, имхо), то я хотел бы создать наборы тестов, которые включают конкретные тесты для конкретных классы и т. д., поэтому их можно запускать исключительно.

Я видел примеры по этому поводу, но я никого не заставил работать. У кого-нибудь есть хороший пример? То есть новый набор тестов, который включает определенные тестовые наборы из одного или нескольких классов тестовых наборов.

Обновлять:

Следующие два примера работают:

Запустите все тесты в пакете:

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) не определен

Что странно, поскольку я не пытаюсь получить доступ к конструктору, а называю конкретный тестовый метод в классе тестового примера (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();
    }
}

А вот класс набора тестов, в который я пытаюсь включить (например) ОДИН из тестов в указанном выше классе:

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;
    }
}

person Community    schedule 09.01.2013    source источник
comment
Кроме того, основная тема этого вопроса, кажется, дрейфует то тут, то там с каждым промежуточным редактированием. Я бы сказал, несправедливо начинать с того, пожалуйста, помогите, я не могу запускать тесты Android, а также не могу найти никакого учебника и через десять минут начать говорить о чем-то совершенно другом. Также опытные разработчики стараются сначала объяснить, что спрашивают.   -  person Audrius Meskauskas    schedule 09.01.2013
comment
Редактировать? Я вообще не редактировал вопрос. Тем не менее, я попытаюсь отредактировать его, чтобы сделать его более понятным. Но при взгляде не вижу сразу где вопрос непонятный? Я спрашиваю следующее: как мне создать наборы тестов, которые НЕ запускают все тесты в пакете, но точно указывают, какие тесты в одном или нескольких классах нужно запускать?   -  person    schedule 09.01.2013
comment
Я просто изменил заголовок, предполагая добросовестность.   -  person Audrius Meskauskas    schedule 09.01.2013
comment
Ах, так проблема была в заголовке. Спасибо :-)   -  person    schedule 09.01.2013


Ответы (4)


Проблема AFAIK заключается в том, что класс AndroidTestCase имеет только один конструктор - AndroidTestCase().

Указание тестовых случаев с помощью строки поддерживается только классом TestCase JUnit, но не AndroidTestCase(). Вот почему вы столкнулись с этой проблемой.

person Sunny    schedule 29.10.2013

Чтобы запустить только подмножество тестовых функций, сделайте так, чтобы ваш метод 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%28java.lang.Class%3C?%3E,%20java.lang.String%29

person Bartek    schedule 23.05.2013

можно добавить различные тестовые классы:

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

Введение в платформу и все связанные с ней классы:

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

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

person Dipak    schedule 09.01.2013
comment
Ok. Если я сделаю это: TestSuite suite= new TestSuite(ArithmeticsTest.class);, return suite; в классе набора тестов он работает так, как ожидалось. Все тесты в классе ArithmeticsTest.class выполняются. Однако в опубликованной вами ссылке показано, как я могу добавить отдельные тесты (методы) в класс. Это не работает для меня. Эта строка: suite.addTest (новый ArithmeticsTest (testAddNumbers)); приводит к неопределенной ошибке конструктора. - person ; 09.01.2013
comment
Я обновил ответ на ваш первоначальный вопрос. Было бы неплохо, если бы вы задали другие проблемы, связанные с ошибками, как другой вопрос. Это поможет другим узнать о вашей проблеме и помочь вам. И, пожалуйста, дайте полную трассировку стека вашей ошибки. Спасибо дружище.. - person Dipak; 10.01.2013
comment
Я не могу заставить его работать. Ваши первые две строки приводят к этой ошибке во второй строке: конструктор TestSuite (Class []) не определен. Строки 3-5 приводят к этой ошибке для строки 3 (и соответствующей для строки 4): Конструктор Mathtest(String) не определен. - person ; 11.01.2013
comment
Вы уверены, что ваш тестовый пример включает эти функции? developer.android.com/reference/junit/framework/TestCase.html в этой ссылке внизу страницы есть сводка о функциях, доступных в классе testcase, проверьте это. Я вернусь с хорошими вещами. - person Dipak; 11.01.2013
comment
Я обновил исходный пост с классом AndroidTestCase и классом набора тестов в обновлении от 11 января. Что мне не хватает? - person ; 11.01.2013
comment
Не уверены, какие импортированные файлы вы имеете в виду? Файл SomeClass? Я включил это, но я действительно не понимаю, как это может помочь. Тесты в тестовом классе (testAddNumbers и testSubtractNumbers) работают нормально, что становится очевидным, когда я включаю все тесты в набор тестов. Это добавление конкретного теста в тестовый класс, который я не могу понять. - person ; 11.01.2013
comment
На самом деле я немного запутался, вы проверили эту ссылку: developer.android. com/reference/junit/framework/ это та же ссылка, которую я предоставил ранее. В этой ссылке для тестового класса MathTest они расширяют TestCase, а в вашей вы расширяете AndroidTestCase.. пожалуйста, проверьте это. - person Dipak; 11.01.2013
comment
Я использую AndroidTestCase. Но я попытался настроить тестовый класс для наследования от TestCase, а не от AndroidTestCase, и он все еще не работает. Я все еще не могу добавить конкретный тест в тестовый класс, в класс набора тестов. - person ; 11.01.2013
comment
Если я просто делаю TestCase test= new ArithmeticsTests(testAddNumbers);, я также получаю ту же ошибку. При попытке добавить конкретный тестовый метод в тестовом классе в тестовый набор он действует так, как будто я пытаюсь отправить строковый параметр в тестовый класс. Что-то очень неправильно и/или отсутствует. - person ; 11.01.2013
comment
Может ли быть так, что функция добавления определенного теста в тестовый класс не поддерживается в версии JUnit, которая поставляется с Android SDK? Я уверен, что видел примеры этого в учебниках/статьях о тестировании JUnit в Android... - person ; 11.01.2013

Я нашел обходной путь для достижения того, что вы хотите.

Проверьте это: Android TestSuite: включить все тестовые случаи за исключением некоторых явно определенных

person Balazs Banyai    schedule 25.07.2014