#java #android #algorithm #unit-testing #testing
#java #Android #алгоритм #модульное тестирование #тестирование
Вопрос:
Я не уверен, что «скалярное тестирование» является правильным термином для этого, но я имею в виду тесты, которые не являются логическими «сбой или успех». Проблема, над которой я работаю, — это хроматический тюнер для Android:
http://code.google.com/p/androidtuner/
И я хочу протестировать алгоритм, запустив несколько файлов wav и обработав результирующий график высоты тона. Цель состоит в том, чтобы определить результат скалярного теста как нормализованную сумму x минус y в квадрате, где x — обнаруженный шаг, а y — ожидаемый шаг. Таким образом, идеальный тестовый прогон будет равен 0, но более реалистично я хотел бы настроить алгоритм и посмотреть, улучшился ли он / как он во всех тестовых примерах.
Вообще говоря, может ли модульный тест привести к числу, а не к логическому значению? Позволяет ли это платформа тестирования Android? Как мне интегрировать любое решение с Eclipse?
Моя текущая идея — просто обойти все и использовать adb для извлечения файлов, сгенерированных после запуска каждого теста. Хотя это не слишком здорово.
Ответ №1:
Мне кажется, что модульный тест — это неправильный инструмент для задачи, которую вы здесь решаете. По самой своей природе фреймворки модульного тестирования предназначены для получения истинных / ложных результатов.
Если все, что вы хотите сделать, это создать некоторые показатели путем тестового вызова вашего алгоритма с различными входными данными, вы можете рассмотреть возможность написания собственного Instrumentation
подкласса. Это то, что сам Android использует для запуска ваших модульных тестов на устройстве.
An Instrumentation
позволит вам вызывать ваши сервисы / действия с любыми наборами данных, которые вам нужны, и вы можете создать результаты Bundle
для обобщения результатов.
Кроме того, вы можете вызвать инструментарий из ADB, точно так же, как набор тестовых примеров.
Ответ №2:
Я думаю, вы можете сделать это с помощью новых функций JUnit4.
Напишите правило, которое выполняет @Before и @After каждый раз: JUnit Kungfu слайд 34
Напишите параметризованный тест, который вычисляет результат: JUnit Kungfu слайд 23
Если вы работаете с электронными таблицами, вы можете заполнить свою электронную таблицу такими значениями, как current-value; expected-min; expected-max
import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.Matchers.*;
import static org.junit.matchers.JUnitMatchers.*;
import java.util.Arrays;
import java.util.Collection;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class ParameterizedTest {
private final int min;
private final int max;
private final int current;
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ -1 , -10, -6 },
{ -2 , -11, -7 },
{ -3 , -12, -8 },
{ -4 , -13, -9 },
{ -5 , -14, -10 }
});
}
public ParameterizedTest(int current, int expectedMin, int expectedMax) {
this.current = current;
this.min = expectedMin;
this.max = expectedMax;
}
@Test
public void testName() throws Exception {
int yourNewValue = YourNormalizer.normalize(current);
assertThat(yourNewValue, both(greaterThan(min)).and(lessThanOrEqualTo(max)));
}
}
Я не знаю другого способа проверки данных. HF
Комментарии:
1. Это кажется хорошим способом импорта данных. Но все же тесты приводят либо к успеху, либо к неудаче.
Ответ №3:
Модульное тестирование в данном случае не совсем подходит. Результатом модульного теста является pass / fail, поэтому вам нужно будет установить пороговое значение (допустимая погрешность), которое определяет, что такое pass. Это действительно дает некоторые результаты, т. Е. Вы можете сравнить количество проходов / сбоев между запусками, но вы также теряете довольно много информации в процессе.
Я бы предложил просто записать скалярные результаты в CSV-файл и загрузить его позже в электронную таблицу. Вы даже можете сделать это из модульных тестов.
Помимо этого, я не могу придумать фреймворк, который делал бы именно то, что вам нужно.