有没有人对一致的多线程应用程序单元测试方法有任何建议?我做了一个应用程序,其中我们的模拟"工作线程"有一个thread.sleep,其时间由公共成员变量指定.我们将使用它,以便我们可以设置特定线程完成其工作所需的时间,然后我们可以执行我们的断言.有没有更好的方法来做到这一点?任何可以处理这个问题的.Net的好模拟框架?
可能重复:
我应该如何对线程代码进行单元测试?
经典的单元测试基本上只是将x放入并期望y out,并使该过程自动化.所以测试任何不涉及时间的东西都是有益的.但是,我遇到的大多数非常重要的错误都与时间有关.线程破坏彼此的数据,或导致死锁.不确定的行为发生了 - 一万分之一.硬的东西.
对于多线程并发系统的"单元测试"部分,有什么有用的东西吗?这些测试如何运作?是否有必要长时间运行此类测试的主题并以一种巧妙的方式改变环境,以便合理地确信它能正常工作?
这是一个我知道的难题和开放式问题,但我想我会把它扔到地板上,看看是否有人有任何有趣的建议.
我已经开发出一种码生成器,其将我们Python接口我们的C++代码(通过SWIG生成),并产生以暴露此作为Web服务所需的代码.当我开发这个代码时,我使用TDD做到了,但我发现我的测试很脆弱.因为每个测试基本上是想验证的输入给定码位(这恰好是一个C++头)我得到的输出给定码位我写了一个小引擎,从XML输入文件读取测试定义和生成测试来自这些期望的案例.
问题是我害怕进入修改代码.那个单元测试自己的事实是:复杂的,b:脆弱的.
因此,我正在尝试考虑解决这个问题的替代方法,并且让我感到震惊,我可能会以错误的方式解决它.也许我需要更多地关注结果,IE:我生成的代码实际运行并执行我想要的代码,而不是代码看起来像我想要的那样.
有没有人有任何类似于他们想要分享的东西的经历?
我已经在SO上看过这篇文章,但至少对Java而言,它仍然存在问题.对于任何应用程序(我正在测试此用例的Web应用程序)而言,这似乎是一个紧迫的问题,这是多线程的.你们是如何以允许线程交错的方式处理它的 - 本质上意味着测试随机线程行为.
您对如何测试多线程应用程序有什么建议吗?
我知道,线程错误很难捕获,它们可能随时发生 - 或者根本不发生.测试很困难,结果永远不会确定.当然最好仔细设计和编程并发模块.
尽管如此 - 我不想忽略测试方面.因此,运行大量同时处理相同项目的线程有时会调用线程错误.
任何想法或最佳实践,以获得隐藏线程错误的高命中率?
(我正在使用.Net/C#)
我想知道是否有一些单元测试框架能够轻松编写多线程测试?
我想象的是:n次同时调用一个特殊的测试方法m次.在完成所有测试线程之后,将调用一个断言方法,其中应该验证一些约束.
我目前的方法是在junit测试方法中创建Thread对象,手动循环每个run()方法中的实际测试用例,等待所有线程然后验证断言.但是使用这个,我为每个测试都有一个大的样板代码块.
你有什么经历?
这篇文章的开头是"单元测试多线程代码中常见的模式有哪些?",但我发现其他 一些关于SO的讨论通常同意"It is Hard(TM)"和"It Depends(TM)".所以我认为减少问题的范围会更有用.
背景:我们正在实现一个简单的调度程序,它为您提供了一种在启动和停止作业时注册回调的方法,当然还可以配置调度的频率.目前,我们正在围绕java.util.Timer创建一个轻量级包装器.
方面:
我还没有找到一种方法依靠唯一的公共接口(类似测试这个调度addJob(jobSchedule, jobArgs,jobListener),removeJob(jobId)).
如何根据指定的时间表计算作业被调用的事实?
执行摘要:当线程中抛出断言错误时,单元测试不会消失.这是有道理的,因为不应该允许一个线程崩溃另一个线程.问题是我如何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) 我们假设我有以下方法应该测试:
@Autowired
private RoutingService routingservice;
public void methodToBeTested() {
Object objectToRoute = initializeObjectToRoute();
if (someConditions) {
routingService.routeInOneWay(objectToRoute);
} else {
routingService.routeInAnotherWay(objectToRoute);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下RoutingService,在单独的线程中运行,因此在它的构造函数中我们有以下内容:
Thread thread = new Thread(this);
thread.setDaemon(true);
thread.start();
Run Code Online (Sandbox Code Playgroud)
问题是RoutingService改变状态,objectToRoute这正是我想要检查的,但这不会立即发生,因此测试失败.但是,如果我添加Thread.sleep()然后它可以工作,但这是不好的做法,因为我知道.
Thread.sleep()在这种情况下我该如何避免?
我有一个摩卡单元测试套件.
当我在本地运行它们时,一切正常.当我在Jenkins CI服务器上运行它们时,它们有时会失败,有时会通过.
我只是无法重现他们失败的原因.什么可能导致这种行为?