我从来没有用 Java 测试过一个程序,因为它们中的大多数都不是多线程的,现在结果是变化的取决于时间和运气,这很糟糕。我不希望我的代码在需要时不工作,例如。
目前我开发的程序按预期运行,现在因为是并发编程线程,我需要像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
这是程序OK时的结果
有时结果是这样的:
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
...
如这里所见,它永远存在,导致程序无法退出。有没有办法像 100x 那样测试,确保程序关闭,我可以稍后修复。
我只需要确保 Java 退出的工具,因为这是成功程序的条件。
最佳答案
别搞错了:您是在寻求工具作为创可贴来缓解症状。
这是错误的做法。您想要修复 潜在的错误。如果您的代码的行为不是确定性的,那么很可能是因为您将错误放入其中。您基本上是在问“我如何更改我的测试以忽略该问题”。答案是:“你不需要。你解决了这个问题”。
所以您应该问问自己:我怎样才能解决根本问题?
有很多方法可以到达那里,在我看来最有用的方法之一是:考虑使用 same thread executor service .
重点是:为了能够测试多线程应用程序,您必须构建程序以允许这样做。
示例:使用“原始”线程对象不是一个好主意。相反,您希望清楚地分离功能。分成“独立工作”的部分,然后有其他类来处理并行运行的事情。
这里有一个有用的抽象:ExecutorServce .您只需将“任务”推送到该服务中,该服务就可以使用多个线程进行处理。事情是:使用前面提到的“相同线程执行器”,您可以使自己能够以单线程方式运行测试……。那么所有的“随机”都可以大大减少。
关于java - 用于 IntelliJ 多线程测试的 Java 工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50059151/