Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 多次运行JUnit测试会得到不同的结果_Android_Debugging_Testing - Fatal编程技术网

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线程上运行。