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将退出,因为这是成功程序的条件.
谢谢你的时间.
别搞错了:你要求工具充当创可贴以调解症状.
这是错误的做法.您想修复底层错误.如果您的代码不具有确定性,那么很可能是因为您在其中添加了一个错误.您基本上是在问"如何更改测试以忽略问题".答案就是:"你没有.你解决了这个问题".
所以你应该问自己:我如何解决潜在的问题?
有很多方法可以实现,这是我眼中最有用的方法之一:研究使用相同的线程执行器服务.
关键是:为了能够测试多线程应用程序,您必须以允许的方式构建程序.
示例:使用"原始"线程对象是个坏主意.相反,您希望明确区分功能.进入"自己"工作的部分,然后有额外的类来处理并行运行的事情.
这里有一个有用的抽象:ExecutorServce.您只需将"任务"推送到该服务中,该服务就可以使用多个线程进行处理.事情是:使用前面提到的"相同的线程执行器",您可以使自己以单线程方式运行测试.然后,所有"随机"都可以大大减少.
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |