Junit如何执行测试用例?

问题描述

我正在设法使Junits具有线程安全性。我有一个静态类,可在整个代码库中使用,就像这样:

public class FaultList {
    private static final String MESSAGE_CONTEXT_KEY = "FaultList";
    private static ThreadLocal<ArrayList<Fault>> threadFaultList = new ThreadLocal();
    private static final String[] ACCOUNT_NOT_FOUND_STRINGS = new String[]{"INVALID CARDHOLDER NUMBER","INVALID CHECK DIGIT ENTERED","RECORD NOT FOUND","DATA REQUESTED IS RESTRICTED FOR TERMINAL"};

    public FaultList() {
    }

    public static void init() {
        threadFaultList.set(new ArrayList());
        MessageContext.getMessageContext().put("FaultList",Collections.synchronizedList(new ArrayList()));
    }

    public static boolean isfdrExceptionAccountNotFound(String errorMessage) {
        for(int i = 0; i < ACCOUNT_NOT_FOUND_STRINGS.length; ++i) {
            if (errorMessage.indexOf(ACCOUNT_NOT_FOUND_STRINGS[i]) != -1) {
                return true;
            }
        }

        return false;
    }

    public static boolean isEmpty() {
        return ((ArrayList)threadFaultList.get()).isEmpty();
    }

    public static void add(Fault fault) {
        ((ArrayList)threadFaultList.get()).add(fault);
        getMessageContextFaults().add(fault);
    }

    public static void addAll(Collection<? extends Fault> faults) {
        ((ArrayList)threadFaultList.get()).addAll(faults);
        getMessageContextFaults().addAll(faults);
    }

    public static List<Fault> getMessageContextFaults() {
        return (List)MessageContext.getMessageContext().get("FaultList");
    }

    public static ArrayList<Fault> getList() {
        return (ArrayList)threadFaultList.get();
    }

    public static boolean isSevereErrorPresent() {
        Iterator var0 = ((ArrayList)threadFaultList.get()).iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return false;
            }

            f = (Fault)var0.next();
        } while(!f.getSeverity().getValue().equalsIgnoreCase("ERROR") && !f.getSeverity().getValue().equalsIgnoreCase("CRITICAL_ERROR"));

        return true;
    }

    public static boolean isPaymentDeniedFaultPresent() {
        Iterator var0 = ((ArrayList)threadFaultList.get()).iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return false;
            }

            f = (Fault)var0.next();
        } while(!f.getId().getName().contains("3179") && !f.getId().getName().contains("3180") && !f.getId().getName().contains("3184"));

        return true;
    }

    public static boolean isAddressparsingFaultPresent() {
        Iterator var0 = ((ArrayList)threadFaultList.get()).iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return false;
            }

            f = (Fault)var0.next();
        } while(!f.getId().getName().contains("3500"));

        return true;
    }

    public static boolean isMemoPostFailedPresent() {
        Iterator var0 = ((ArrayList)threadFaultList.get()).iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return false;
            }

            f = (Fault)var0.next();
        } while(!f.getId().getName().contains("3069"));

        return true;
    }

    public static boolean isCreditCardTypeWarningPresent() {
        Iterator var0 = ((ArrayList)threadFaultList.get()).iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return false;
            }

            f = (Fault)var0.next();
        } while(!f.getId().getName().contains("3173"));

        return true;
    }

    public static Fault getSevereFaultFromFaultList() {
        Iterator var0 = getList().iterator();

        Fault f;
        do {
            if (!var0.hasNext()) {
                return null;
            }

            f = (Fault)var0.next();
        } while(!f.getSeverity().getValue().equalsIgnoreCase("ERROR") && !f.getSeverity().getValue().equalsIgnoreCase("CRITICAL_ERROR"));

        return f;
    }
}

使用ThreadLocal编写该类,该类将faultList绑定到每个单个线程,因此在单独的线程中执行的junit不会互相干扰。在如下编写的同一线程中执行的junit会发生什么?

public void A(){
        FaultList.init();
        FaultList.add(fault1);
} 

public void B(){
     FaultList.init()
     FaultList.add(faul2);
}

Java会顺序在同一线程中执行这些Junit吗?还是会例如一次通过从每个指令中获取一条指令来执行两者,从而造成并发问题?

解决方法

默认情况下,Junit是以确定性但不可预测的顺序执行测试用例。

这里有一些不错的读物:

,

默认情况下,JUnit在一个线程中(即顺序地)运行测试。但是,有多种方法可以运行测试和测试方法,尤其是在并行线程中。对于JUnit 5,仅可以通过configuration parameters切换此功能。