如何用android进行标量测试?

时间:2011-10-29 17:23:17

标签: java android algorithm unit-testing testing

我不确定“标量测试”是否正确,但我的意思是测试不是布尔“失败或成功”。我正在研究的问题是android的半音调音器:

http://code.google.com/p/androidtuner/

我想通过运行一些wav文件并处理生成的音高图来测试算法。目标是将标量测试结果定义为标准化的x-minus-y平方和,其中x是检测到的音调,y是预期音调。所以一个完美的测试运行将是0,但更现实的是我想调整算法,看看它是否/如何改进所有测试用例。

一般来说 - 单元测试结果可以是数字而不是布尔值吗? android测试框架是否允许它?我应该如何与Eclipse集成哪个解决方案?

我目前的想法是绕过一切并使用adb来获取运行每个测试后生成的文件。虽然那不太棒。

3 个答案:

答案 0 :(得分:1)

让我感到震惊的是,单元测试是你在这里处理的任务的错误工具。就其本质而言,单元测试框架旨在产生真/假结果。

如果您要做的只是通过使用不同的输入数据调用您的算法来生成一些指标,您可能需要考虑编写自己的Instrumentation子类。这就是Android本身用于在设备上运行单元测试的内容。

Instrumentation允许您使用所需的任何数据集调用服务/活动,并且可以构建结果Bundle以汇总结果。

另外,您可以从ADB调用检测,就像一组测试用例一样。

答案 1 :(得分:0)

我认为,你可以用JUnit4的新功能来实现它。

每次写一个执行@Before和@After的规则: JUnit Kungfu slide 34

编写一个计算结果的参数化测试: JUnit Kungfu slide 23

如果您使用电子表格,则可以使用以下值填充电子表格 电流值;预期-分钟;预期-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

答案 2 :(得分:0)

在这种情况下,单元测试并不合适。单元测试的结果是通过/失败,因此您需要设置一个阈值(误差范围)来定义什么是通过。这确实产生了一些结果,即你可以比较运行之间的通过/失败次数,但是你也会在这个过程中丢失相当多的信息。

我建议只将标量结果记录到CSV文件中,然后将其加载到电子表格中。你甚至可以在单元测试中做到这一点。

除此之外,我无法想到一个完全符合你需要的框架。