Junit несколько потоков - PullRequest
       4

Junit несколько потоков

4 голосов
/ 18 октября 2011

У меня есть тестовый пример, который предоставляет аргументы и выполняет основной метод класса. Как лучше всего использовать Junit, чтобы несколько потоков одновременно выполняли метод main класса.

Ответы [ 3 ]

7 голосов
/ 19 октября 2011

Не уверен, если TestNG вариант для вас, но это довольно просто с ним:

@Test(invocationCount = 100, threadPoolSize = 10)
public void myTest() { ... }

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

1 голос
/ 18 октября 2011

Зачем ты это делаешь?Ваш public static void main(String []) действительно управляется несколькими потоками?Кажется странным дизайном, поэтому я проверяю.

Если, с другой стороны, вы хотите протестировать параллельное выполнение вашей программы (т.е. каждое в отдельной JVM), это не то же самое, что многопоточный, и JUnit не будет этого делать, поскольку он выполняется в той же JVM.Вы все еще можете это сделать, без проблем, но убедитесь, что знаете разницу.

Некоторые примеры SO:

0 голосов
/ 21 февраля 2017

Вот облегченное решение:

Вот класс, который вы хотите протестировать:

package mTTest;

/**
 * UUT class is the Unit Under Test. This will be tested.
 * It has two simple method:
 *  push(): sets the message string if it's null, and waits otherwise. 
 *  pop():  if there is any message sets it null and returns it.
 *
 */
public class UUT {
    String message = null;

    synchronized void push(String msg){
        while (null != message) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        message = msg;
        notifyAll();
    }

    synchronized String pop(){
        while (null == message) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        String ret = message;
        message = null;
        notifyAll();
        return ret;
    }


}

Вот тестовый класс. Это будет вызвано средой JUnit. Перепишите метод multiTest (). пакет mTTest;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;

import org.junit.Test;

/**
 * This is the JUnit test class. Method in this class will invoked by the JUnit
 * framework.
 */
public class DUTTest {

    /**
     * Stores sub test threads errors.
     */
    private static List<AssertionError> errors;

    /**
     * sub test threads call this function with they errors.
     * @param err
     */
    static void handle(AssertionError err){
        errors.add(err);
    }

    /**
     * Simpler single thread test
     * @throws InterruptedException
     */
    @Test
    public void testSingle() {
        UUT dut = new UUT();

        dut.push("hello");

        assertEquals("set-get", "hello", dut.message);
    }


    /**
     * Complex multi-thread test
     * @throws InterruptedException
     */
    @Test
    public void testMulti() throws Exception {
        /*
         * Initialization
         */
        errors = Collections.synchronizedList(new ArrayList<AssertionError>());
        UUT dut = new UUT();
        MyTestThread th = new MyTestThread(dut);

        /*
         * Tests
         */
        dut.push("hello");

        assertEquals("set-get", "hello", dut.message);

        th.start();

        dut.push("hello");

        th.join();

        /*
         * Error handling 
         */
        ListIterator<AssertionError> iter = errors.listIterator(errors.size());

        while (iter.hasPrevious()) {
            AssertionError err = iter.previous();
            err.printStackTrace();
            if(iter.previousIndex() == -1){
                throw err;
            }
        }
    }


}

Вот тема, которую можно вызывать несколько раз. Переопределить метод test ().

package mTTest;

import static org.junit.Assert.assertEquals;

/**
 * This is the custom test thread class. The main test thread (which is started
 * by JUnit) starts this thread. 
 *
 */
public class MyTestThread extends Thread {
    UUT dut;

    /**
     * Constructor
     * @param dut : should be overwritten to your custom DUT-class
     */
    public MyTestThread(UUT dut) {
        this.dut =dut;
    }

    /**
     * run() method is final to prevent overriding. Override test instead.
     * It just calls the test method and handle the assertion errors.
     */
    @Override
    public final void run() {
        try{
            test();
        } catch (AssertionError ex){
            DUTTest.handle(ex);
        }
    }


    /**
     * Write your tests here. run calls this function. 
     */
    void test(){
        assertEquals("set-get", "This will cause an ERROR", dut.pop());
        assertEquals("set-get", "hello", dut.pop());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...