2

我的应用程序有一个测试用例,它TextView在 Activity 中填充 s,然后模拟单击将Save数据提交到数据库的按钮。我用不同的数据重复了几次,调用Instrumentation.waitForIdleSync(),然后检查插入的数据是否确实在数据库中。我最近连续运行了 3 次这个测试,没有更改或重新编译我的代码。每次的结果都不同:一个测试运行通过,另外两个测试运行报告数据库中缺少不同的数据项。什么可能导致这种行为?是否可能是由于竞争线程之间的某种竞争条件?当每次运行结果都不同时,如何调试它?

4

3 回答 3

1

看起来像一个比赛条件。请记住,在线程世界中,没有办法确保运行时顺序。

我不是 android 开发人员,所以我只是在推测,但 UI 通常只在一个事件线程上,所以当你从另一个线程(你的测试)调用方法时,你可能会因为你不在事件线程之外而破坏它.

您可以尝试使用信号量或更可能是对资源的锁定。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/Lock.html http://docs.oracle.com/javase/1.5.0/docs/api /java/util/concurrent/Semaphore.html

于 2013-02-21T02:23:17.730 回答
1

我(终于!)找到了解决这个问题的方法。我现在呼吁finish()被测试Activity者确保它与数据库的所有连接都已关闭。当我运行断言时,这似乎可以确保数据的一致性。

于 2013-11-23T02:23:14.547 回答
0

我建议对数据库数据进行探测,而不是直接断言。我的意思是制作一段代码,它将在一段时间内不断检查数据库,而不是等待 x 秒(或空闲时间)然后检查,我不在合适的计算机上,所以以下只是伪代码

public static void assertDatabaseHasData(String message, String dataExpected, long maxTimeToWaitFor){
    long timeToWaitUntil = System.getCurrentTimeMillis() + maxTimeToWaitFor;
    boolean expectationMatched = false;
    do {
        if(databaseCheck() == dataExpected){
            expecttionMatched == true;
        }
    }while(!expectationMatched  && System.getCurrentTimeMillis() < timeToWaituntil);
    assertTrue(message, expectationMatched);
}

当我使用计算机时,我会尝试重新审视上述内容并使其变得更好(我实际上会使用 hamcrest 而不是断言,但这是个人喜好)

于 2013-02-21T08:43:59.240 回答