【问题标题】:jUnit test cases for Threads线程的 jUnit 测试用例
【发布时间】:2018-12-14 06:24:06
【问题描述】:

我知道测试线程总是一个挑战。除了测试线程之外,我只收到了一个问题。有没有一种方法可以测试线程并使用 jUnit 找出哪些数据通过了哪个线程。 假设有 n 个线程将数据存储到表中。我们能不能弄清楚哪一行数据是由哪个线程存储的。

更新

public void storePrescription(List<Prescription> payload) {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    for (Prescription presciption : payload) {
        Runnable runnable = new PrescriptionThread(presciption, prescriptionService);
        executorService.execute(runnable);
    }
    executorService.shutdown();

    while(!executorService.isTerminated()) {}
}

线程类

public class PrescriptionThread implements Runnable{

private PrescriptionService presServ;

private  Prescription pres ;

public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService) {
    this.pres = pres;
    this.presServ = prescriptionService;
}

@Override
public void run() {
    presServ.savePrescription(pres);
}
}

【问题讨论】:

  • 命名Runnables 线程令人困惑(你有PrescriptionThread)并且不正确。传统上,此类类称为workers,如PrescriptionWorker
  • @DavidSoroko 你的意思是说最好使用 Thread 而不是 Runnable
  • 不,我的意思是你给 Runnables 起的名字不应该包含“线程”这个词。
  • 好的。我有 。我已将其更改为 Worker,感谢您的建议。

标签: java multithreading unit-testing junit threadpool


【解决方案1】:

最严格的方法是记录当前线程名称或 id 以及它正在处理的数据。

Logger logger = Logger.getLogger(TestLogThreadName.class);
String currentThreadName = Thread.currentThread().getName();
logger.trace("processing data (" + data + ") with Thread " + currentThreadName);

尽管这将是最容易实现的,但它仍然取决于数据大小,因为生成的日志文件可能很大且难以阅读。

你想监控什么方面,如果是硬件资源,比如cpu或内存,也许你可以尝试使用操作系统提供的一些工具。

更新:

首先创建一个写日志的util类,

import org.apache.log4j.Logger;
public class LogThreadNameUtil{

    static Logger logger = Logger.getLogger(LogThreadNameUtil.class);

    public static void log(String threadName
        , Prescription prescription){
        //you have to get specific 
        //field value from prescription or override toString()
        logger.trace("processing data (" + prescription 
            + ") with Thread " + currentThreadName);
    }
}

然后从你的跑步者那里调用日志工具,

public class PrescriptionThread implements Runnable{

private PrescriptionService presServ;

private  Prescription pres ;

public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService) {
    this.pres = pres;
    this.presServ = prescriptionService;
}

@Override
public void run() {
        presServ.savePrescription(pres);
        LogThreadNameUtil.log(Thread.currentThread().getName(), pres);
    }
}

【讨论】:

  • 我怎样才能为上面的代码提供这个。更新部分中的代码。
  • 你们所说的一切都很好。如果我必须在跑步时这样做。但我想在单元测试用例时对其进行测试。
  • 您的意思是要在单元测试期间记录线程名称和“处方”吗?您能否发布单元测试代码以获取更多上下文?
  • 如果你从单元测试实例化并启动线程,它应该用上面的代码记录线程信息,因为日志调用行在run方法内。所以不管你如何启动线程。
  • 这里的问题是我无法将日志保存在运行中。因为我不希望在应用程序运行时对其进行跟踪。只有从 jUnit o 想要跟踪每个线程。这可能吗?..
【解决方案2】:

您可以以任何对您有意义的方式命名您的工人,并在run 方法中记录如下:

public class PrescriptionThread implements Runnable{

    private PrescriptionService presServ;
    private  Prescription pres ;
    private  String name ;

    public PrescriptionThread(Prescription pres, PrescriptionService prescriptionService, String name) {
        this.pres = pres;
        this.presServ = prescriptionService;
        this.name = name;
    }

    @Override
    public void run() {
        presServ.savePrescription(pres);
        LOG.info("Worker-" + name + " saved: " + pres);
    }
}

【讨论】:

  • 我实际上是在 jUnit 中尝试这个测试。它应该验证同样的事情。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多