用于IntelliJ的多线程测试的Java工具

lie*_*es1 1 java testing concurrency junit multithreading

这是一个简单的问题,我从来没有在Java中测试程序,因为大多数都不是多线程,现在结果取决于时间和运气,这很糟糕.我不希望我的代码在需要时不工作,例如.我的IDE确实是IntelliJ

目前我开发的程序已按预期工作,现在因为它是一个带线程的并发编程,我需要运行100x然后发生随机错误.我不希望程序无限循环,而不是关闭程序.

结果示例:

Exit: Bus 37 exit the store
Size of Shop: 0
Cleaner : We're closing now!
Cleaner : We're closing now!
Depot : We're closing now!
Mechanics : We're closing now!
Mechanics : We're closing now!
Parking: We are closing now!

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

这是程序正常时的结果

有时结果如下:

Ramp: Bus 37 using the ramp
Size of Shop: 2
Size of Shop: 2
Ramp: Bus 37 exit the ramp
Exit: Bus 37 exit the store
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
Size of Shop: 1
...
Run Code Online (Sandbox Code Playgroud)

正如此处所见,它永远存在,导致程序无法退出.有没有办法测试像100x,确保程序是关闭的,我可以稍后修复.

我只需要工具来确保Java将退出,因为这是成功程序的条件.

谢谢你的时间.

Gho*_*ica 5

别搞错了:你要求工具充当创可贴以调解症状.

这是错误的做法.您想修复底层错误.如果您的代码不具有确定性,那么很可能是因为在其中添加了一个错误.您基本上是在问"如何更改测试以忽略问题".答案就是:"你没有.你解决了这个问题".

所以你应该问自己:我如何解决潜在的问题?

有很多方法可以实现,这是我眼中最有用的方法之一:研究使用相同的线程执行器服务.

关键是:为了能够测试多线程应用程序,您必须以允许的方式构建程序.

示例:使用"原始"线程对象是个坏主意.相反,您希望明确区分功能.进入"自己"工作的部分,然后有额外的类来处理并行运行的事情.

这里有一个有用的抽象:ExecutorServce.您只需将"任务"推送到该服务中,该服务就可以使用多个线程进行处理.事情是:使用前面提到的"相同的线程执行器",您可以使自己以单线程方式运行测试.然后,所有"随机"都可以大大减少.