簡體   English   中英

線程的jUnit測試用例

[英]jUnit test cases for Threads

我知道測試線程始終是一個挑戰。 除了測試Thread外,我還有一個問題。 有沒有一種方法可以測試線程,並可以使用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);
}
}

最棘手的方法是記錄當前線程名稱或ID及其正在處理的數據。

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

即使這是最容易實現的方法,它仍然取決於數據大小,因為生成的日志文件可能很大且難以讀取。

您想監視哪個方面,如果它涉及到諸如cpu或內存之類的硬件資源,也許您可​​以嘗試使用OS提供的某些工具。

更新:

首先創建一個用於編寫日志的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方法中記錄如下:

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM