java - 用于 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 退出的工具,因为这是成功程序的条件。
解决方案
别搞错了:您要求的工具可以充当缓解症状的创可贴。
那是错误的做法。您想修复潜在的错误。如果您的代码行为不具有确定性,那么很可能是因为您将错误放入其中。你基本上是在问“我如何改变我的测试来忽略这个问题”。答案是:“你没有。你解决了这个问题”。
所以你应该问自己:我怎样才能解决根本问题?
有很多方法可以到达那里,在我看来最有帮助的方法之一:研究使用相同的线程执行器服务。
关键是:为了能够测试多线程应用程序,您必须以允许的方式构建程序。
示例:使用“原始”线程对象是一个坏主意。相反,您希望清楚地分离功能。进入“独立”工作的部分,然后有额外的类来处理并行运行的事情。
这里有一个有用的抽象:ExecutorServce。您只需将“任务”推送到该服务中,该服务就可以使用多个线程进行处理。事情是:使用前面提到的“相同线程执行器”,您可以让自己运行测试......以单线程方式。然后可以大大减少所有“随机”。
推荐阅读
- python - 无法使用正则表达式、漂亮的汤和 python 在列表中抓取和排列卡片的详细信息
- snowflake-cloud-data-platform - 雪花中的#有什么用
- postgresql - 使用 Hibernate 对 PostgreSQL 数据库中的 JSON 对象进行版本控制
- python - 如何读取 csv 文件并更改所需文件夹的目录
- server - 赛普拉斯断言在 OpenShift pod 上失败,但在本地机器上传递
- javascript - 在 Highcharts 更新到 9 后,在图像工作中使用“:data”引用制作 SVG
- mysql - nvarchar 长度从一个表更新到另一个表
- append - 如何将多个项目附加到嵌套列表?您如何成功地处理过河问题的变体?
- r - 基于所有其他字符列中的逐行字符串检测来改变条件列
- javascript - 无法解决 moment/ts3.1-typings/moment 中的错误