这是我和我的团队在几乎所有项目中都面临的一个问题。用JUnit测试应用程序的某些部分并不容易,您需要尽早开始并坚持使用它,但这不是我要问的问题。实际的问题是,使用n-线程、锁定、线程和共享对象中的可能异常,测试任务并不像测试类那么简单,而是在线程内无休止的可能情况下测试它们。
更准确地说,让我告诉你我们其中一个应用程序的设计:
当用户提出请求时,启动多个线程,每个线程分析数据的一部分以完成分析,这些线程根据要分析的数据块的大小(无休止的和不确定的质量)运行一定时间,或者如果数据不够充分/缺乏质量,它们可能失败。在每个线程完成其分析之后,它们都调用一个处理程序,该处理程序在每个线程结束后决定收集的分析-数据是否足以提供对请求的答复。
所有这些分析器都共享应用程序的某些部分(有些部分是因为实例非常大,并且只有一定数量的实例可以加载到内存中,而这些实例是可重用的;有些部分是因为它们有固定的连接,连接需要时间,ex.gr )。因此,锁定是非常常见的(使用可重入锁)。虽然应用程序运行非常高效和快速,但在实际情况下测试它并不容易。
我们现在要做的是测试每个类及其预定义的条件,但是没有关于联锁和同步的自动化测试,在我的选项中,这对质量保证不是很好。
考虑到这个例子,您将如何处理线程、联锁和同步的测试?
发布于 2013-06-04 10:58:29
因为我对收到的答案从来都不满意,所以我已经放弃了,用时间解决了并发问题,但是没有实际的测试证明它们已经不存在了。但今天我偶然找到了解决这个问题的办法。
解释编写这类测试的链接:
总之,所有这些测试都初始化Runnable并同时启动它们以达到最大并发负载,这样就应该暴露并发问题。
发布于 2013-02-05 17:10:49
通常,当您进行单元测试时,您会将代码拆分为最小的部分,并对每个部分进行隔离测试。有时,您需要模拟依赖项--一个称为模仿的过程。好的模拟库包括JMockit (用于完全模拟任何东西,包括使字符串可变)或Mockito (如果您的需求是正常的)。
如今,Java中的多线程应用程序应该构建在java.util.concurrent包上,并以ExecutorService为核心。除非您的需求非常具体,否则不再需要直接访问Thread。
给定基于并发包的设计,您应该能够分解分析并为它们构造独立的单元测试。这种方法应该大大简化您的代码,并使线程的行为比目前听起来更可预测。
https://softwareengineering.stackexchange.com/questions/185953
复制相似问题