我有一个测试用例,用于填充活动中的TextView
的应用程序,然后模拟单击将数据提交到数据库的Save
按钮。我用不同的数据重复这几次,调用Instrumentation.waitForIdleSync()
,然后检查插入的数据实际上是否在数据库中。我最近连续三次运行这个测试,没有改变或重新编译我的代码。每次的结果都不一样:一次测试运行通过,另外两次测试运行报告数据库中缺少不同的数据项。什么会导致这种行为?这是否可能是由于竞争线程之间的竞争条件?如果每次运行结果都有所不同,我该如何进行调试?多次运行JUnit测试给出了不同的结果
2
A
回答
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
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而不是断言,但是这是个人喜好)
0
我(终于!)找到了解决这个问题的办法。我现在在测试的Activity
上拨打finish()
以确保其与数据库的所有连接均已关闭。这似乎确保了在运行断言时数据的一致性。
相关问题
- 1. Xcode每次运行C++测试都会给出不同的结果
- 2. JUnit:运行同时测试
- 3. 使用不同的数据多次运行相同的JUnit测试用例
- 4. 了解这些JUnit测试结果
- 5. 使用不同的参数多次执行jUnit runner运行测试类
- 6. Parallel.ForEach每次给出不同的结果
- 7. C pread给出了不同的结果
- 8. ResNet50从keras给出了不同的预测结果和输出结果
- 9. 列出正在运行的jUnit测试
- 10. CUDA C/C++:相同的可执行文件给出了第一次运行的不同结果
- 11. C#重载运算符给出了不同的结果
- 12. 重新运行一组的JUnit测试多次
- 13. 同时运行JUnit测试用例
- 14. 并行运行JUnit测试
- 15. 输出测试类运行JUnit
- 16. 运行Cucumber Junit测试时出错:Intializationerror
- 17. 多次运行NUnit测试
- 18. 如何获得JUnit(WebDriver)测试重新运行多次?
- 19. 在Eclipse中,如何多次运行JUnit测试用例
- 20. JUnit测试用例在eclipse中运行多次
- 21. 从Eclipse开始与mvn测试不同的JUnit结果
- 22. 如何将junit测试运行结果记录到数据库
- 23. PHP exec()和正在运行的shell脚本给出了不同的结果
- 24. 我不能运行我的JUnit测试了
- 25. 尝试运行JUnit测试运行器时出错
- 26. 试图运行微不足道的Android JUnit测试。获取:“测试运行失败:没有测试结果”我错过了什么?
- 27. ActiveSheet.UsedRange.Rows.count在每次运行时给出错误和不同的结果
- 28. 顺序模型在每次运行中给出不同的结果
- 29. MATLAB SVM:使用相同的数据集进行训练和测试给出了不同的结果
- 30. 单元测试和现场运行给不同的XML解析结果
感谢链接到锁和信号类。我会研究这些。添加到JUnit的Android需要在我的测试中使用的一些方法在UI线程上运行,例如模拟按钮单击。我想我需要看看还有哪些线程也在运行。我怀疑还有至少一个,因为我必须明确告诉JUnit在UI线程上运行了哪些测试(或部分测试)。 – 2013-02-22 03:37:44
而且,由于我的问题是具体到Android,这里都为[java.util.concurrent包] Android的文档(http://developer.android.com/reference/java/util/concurrent/package-summary.html) 。 – 2013-02-22 06:02:34