我有一个测试用例,用于填充活动中的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. @Autowired在每次JUnit测试中给出不同的对象
- 3. JUnit:运行同时测试
- 4. 运行多个JUnit测试 - 如果故障发生一次
- 5. 使用不同的数据多次运行相同的JUnit测试用例
- 6. 了解这些JUnit测试结果
- 7. 如何从测试运行器获取JUnit测试结果?
- 8. 使用不同的参数多次执行jUnit runner运行测试类
- 9. Parallel.ForEach每次给出不同的结果
- 10. Php.ini给出了不同的结果
- 11. C pread给出了不同的结果
- 12. NSDateFormatterFullStyle api给出了不同的结果
- 13. 防止运行两次junit测试
- 14. ResNet50从keras给出了不同的预测结果和输出结果
- 15. 列出正在运行的jUnit测试
- 16. 运行测试用例多次与不同@BeforeClass设置JUnit 4中
- 17. 运行相同的代码时,Selenium IDE给出了不同的结果
- 18. junit tfs测试结果
- 19. 用不同的设置多次运行相同的测试
- 20. CUDA C/C++:相同的可执行文件给出了第一次运行的不同结果
- 21. C#重载运算符给出了不同的结果
- 22. 调试和单元测试运行时GetHashCode不同的结果
- 23. nUnit测试中的不同结果 - 运行vs调试
- 24. 重新运行一组的JUnit测试多次
- 25. 使用BoostTest多次运行单元测试而不退出测试运行器
- 26. 运行Android的JUnit测试
- 27. 同时运行JUnit测试用例
- 28. Pelles C和GCC用这个C素数测试给出了不同的结果
- 29. 不能运行调试robotium junit测试
- 30. 并行运行JUnit测试
感谢链接到锁和信号类。我会研究这些。添加到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