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