Android 多次运行JUnit测试会得到不同的结果
我的应用程序有一个测试用例,它在活动中填写Android 多次运行JUnit测试会得到不同的结果,android,debugging,testing,Android,Debugging,Testing,我的应用程序有一个测试用例,它在活动中填写TextViews,然后模拟单击Save按钮将数据提交到数据库。我用不同的数据重复了几次,调用Instrumentation.waitForIdleSync(),然后检查插入的数据是否确实在数据库中。我最近连续三次运行这个测试,没有更改或重新编译代码。每次的结果都不同:一个测试运行通过,另外两个测试运行报告数据库中缺少不同的数据项。是什么导致了这种行为?这可能是由于竞争线程之间的某种竞争条件造成的吗?当每次运行结果都不同时,如何调试它?看起来像是竞争条件
TextView
s,然后模拟单击Save
按钮将数据提交到数据库。我用不同的数据重复了几次,调用Instrumentation.waitForIdleSync()
,然后检查插入的数据是否确实在数据库中。我最近连续三次运行这个测试,没有更改或重新编译代码。每次的结果都不同:一个测试运行通过,另外两个测试运行报告数据库中缺少不同的数据项。是什么导致了这种行为?这可能是由于竞争线程之间的某种竞争条件造成的吗?当每次运行结果都不同时,如何调试它?看起来像是竞争条件。
请记住,在线程世界中,无法确保运行时顺序
我不是android开发人员,所以我只是猜测,但是UI通常只在一个事件线程上,所以当您从另一个线程(您的测试)调用该方法时,您可能会破坏它,因为您在事件线程之外
您可以尝试使用信号量,或者更可能是资源上的锁。
我建议对数据库数据进行探测,而不是直接断言。我的意思是制作一段代码,它将持续检查数据库达一定时间,而不是等待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);
}
public static void assertDatabaseHasData(字符串消息、字符串数据预期、长maxTimeToWaitFor){
long-timeToWaitUntil=System.getCurrentTimeMillis()+maxTimeToWaitFor;
布尔期望匹配=假;
做{
如果(databaseCheck()==dataExpected){
ExpectionMatched==true;
}
}而(!expectationMatched&&System.getCurrentTimeMillis()
当我接触到一台计算机时,我会尝试重新阅读上面的内容并使其更好(我实际上会使用hamcrest而不是asserts,但这是我个人的偏好)我(终于!)找到了这个问题的解决方案。现在,我对已测试的
活动
调用finish()
,以确保其与数据库的所有连接都已关闭。当我运行断言时,这似乎可以确保数据的一致性。感谢到锁和信号量类的链接。我会调查这些。Android对JUnit的添加要求我的测试中使用的一些方法在UI线程上运行,比如模拟按钮点击。我想我需要看看还有哪些线程也在运行。我想至少还有一个问题,因为我必须明确告诉JUnit哪些测试(或部分测试)在UI线程上运行。