Тестовые случаи jUnit для потоков - PullRequest
0 голосов
/ 14 декабря 2018

Я знаю, что тестирование потоков - это всегда вызов.В дополнение к тестированию темы у меня только один вопрос.Есть ли способ, которым мы можем проверить потоки и выяснить, какие данные прошли через какой поток, используя 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);
}
}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете называть своих работников любым удобным для вас способом и регистрироваться в методе 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);
    }
}
0 голосов
/ 14 декабря 2018

Самый простой способ - это записать имя или идентификатор текущего потока и данные, которые он обрабатывает.

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

Даже если это будет проще всего реализовать, это все равно зависит от размера данных, посколькусгенерированный файл журнала может быть огромным и трудным для чтения.

Какой аспект вы пытаетесь отслеживать, если это связано с аппаратными ресурсами, такими как процессор или память, возможно, вы можете попробовать использовать какой-нибудь инструмент, предоставляемый ОС.

обновлено:

сначала создайте класс утилит для записи журнала,

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