到目前为止,我已经避免了测试多线程代码的噩梦,因为它看起来像是一个雷区太多了.我想问一下人们如何测试依赖线程成功执行的代码,或者人们如何测试那些只在两个线程以给定方式交互时出现的问题?
对于今天的程序员来说,这似乎是一个非常关键的问题,将我们的知识集中在这个imho上是有用的.
可能重复:
我应该如何对线程代码进行单元测试?
经典的单元测试基本上只是将x放入并期望y out,并使该过程自动化.所以测试任何不涉及时间的东西都是有益的.但是,我遇到的大多数非常重要的错误都与时间有关.线程破坏彼此的数据,或导致死锁.不确定的行为发生了 - 一万分之一.硬的东西.
对于多线程并发系统的"单元测试"部分,有什么有用的东西吗?这些测试如何运作?是否有必要长时间运行此类测试的主题并以一种巧妙的方式改变环境,以便合理地确信它能正常工作?
您对如何测试多线程应用程序有什么建议吗?
我知道,线程错误很难捕获,它们可能随时发生 - 或者根本不发生.测试很困难,结果永远不会确定.当然最好仔细设计和编程并发模块.
尽管如此 - 我不想忽略测试方面.因此,运行大量同时处理相同项目的线程有时会调用线程错误.
任何想法或最佳实践,以获得隐藏线程错误的高命中率?
(我正在使用.Net/C#)
执行摘要:当线程中抛出断言错误时,单元测试不会消失.这是有道理的,因为不应该允许一个线程崩溃另一个线程.问题是我如何1)在第一个辅助线程崩溃时使整个测试失败,或者2)循环并确定每个线程完成后的状态(参见下面的代码).执行后者的一种方法是通过具有每线程状态变量,例如"boolean [] status"并且具有"status [i] == false"意味着线程失败(这可以被扩展以捕获更多信息).但是,这不是我想要的:我希望它在抛出断言错误时就像任何其他单元测试一样失败.这甚至可能吗?这是可取的吗?
我感到无聊,我决定在我的单元测试中产生一堆线程,然后让它们调用一个服务方法,只是为了它.代码看起来大致如下:
Thread[] threads = new Thread[MAX_THREADS];
for( int i = 0; i < threads.length; i++ ) {
threads[i] = new Thread( new Runnable() {
private final int ID = threadIdSequenceNumber++;
public void run() {
try {
resultRefs[ID] = runTest( Integer.toString( ID ) ); // returns an object
}
catch( Throwable t ) {
// this code is EVIL - it catches even
// Errors - don't copy it - more on this below …Run Code Online (Sandbox Code Playgroud) 我想知道有什么好方法可以对同步进行断言或者某些事情以便我可以检测同步违规(在测试时).
例如,我将使用一个不是线程安全且不会是线程安全的类的情况.通过某种方式,如果从多个线程调用某些方法,我会有一些断言可以通知我(日志或其他东西).
我渴望能够为AWT调度线程做类似的事情,具体如下:
public static void checkDispatchThread() {
if(!SwingUtilities.isEventDispatchThread()) {
throw new RuntimeException("GUI change made outside AWT dispatch thread");
}
}
Run Code Online (Sandbox Code Playgroud)
我只想要更通用的东西.问题描述不是很清楚,但我希望有人有一些好方法=)
如何证明多线程在我的C#程序中有效?这是针对测试要求的.例如,我将不得不在记录器类中添加一些锁定(是的,我知道,我不应该编写自己的日志类),我需要一个测试用例来证明更改是有效的.