首页 > 解决方案 > 用于 IntelliJ 多线程测试的 Java 工具

问题描述

我从来没有用 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

这是程序正常时的结果

有时结果是这样的:

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 退出的工具,因为这是成功程序的条件。

标签: javamultithreadingtestingjunitconcurrency

解决方案


别搞错了:您要求的工具可以充当缓解症状的创可贴

那是错误的做法。您想修复潜在的错误。如果您的代码行为不具有确定性,那么很可能是因为将错误放入其中。你基本上是在问“我如何改变我的测试来忽略这个问题”。答案是:“你没有。你解决了这个问题”。

所以你应该问自己:我怎样才能解决根本问题?

有很多方法可以到达那里,在我看来最有帮助的方法之一:研究使用相同的线程执行器服务

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

示例:使用“原始”线程对象是一个坏主意。相反,您希望清楚地分离功能。进入“独立”工作的部分,然后有额外的类来处理并行运行的事情。

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


推荐阅读