如何解决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是以确定性但不可预测的顺序执行测试用例。
这里有一些不错的读物:
- Junit5-https://www.baeldung.com/junit-5-test-order
- Junit4-https://github.com/junit-team/junit4/wiki/Test-execution-order
默认情况下,JUnit在一个线程中(即顺序地)运行测试。但是,有多种方法可以运行测试和测试方法,尤其是在并行线程中。对于JUnit 5,仅可以通过configuration parameters切换此功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。