![](/img/trans.png)
[英]Concurrent Spring Boot tests using JUnit 5 are starting mulitple JVMs
[英]Loading junit tests to different jvms
我有TestColumnPrefixFilter
來自Apache Hbase項目的名為TestColumnPrefixFilter
junit測試用例。 在此測試用例中,有2個測試。 當我使用命令行使用maven運行此測試用例時:
mvn test -Dtest=org.apache.hadoop.hbase.filter.TestColumnPrefixFilter
我得到這個結果:
Running org.apache.hadoop.hbase.filter.TestColumnPrefixFilter
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.585 seconds
我的問題是,有沒有辦法在不修改代碼的情況下從此測試用例分別運行這兩個測試? Maven或Java有什么選擇嗎? 還是可以在不同的jvm中運行這兩個測試? 因為當我調用上面的命令行時,該測試用例被加載到單個jvm中,並且該jvm用於我不想要的兩個測試。
我嘗試了Maven的perTest選項,但是沒有用
Java文件在下面
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.filter;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.regionserver.HRegion;
import org.apache.hadoop.hbase.regionserver.InternalScanner;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@Category(SmallTests.class)
public class TestColumnPrefixFilter {
private final static HBaseTestingUtility TEST_UTIL = new
HBaseTestingUtility();
@Test
public void testColumnPrefixFilter() throws IOException {
String family = "Family";
HTableDescriptor htd = new HTableDescriptor("TestColumnPrefixFilter");
htd.addFamily(new HColumnDescriptor(family));
HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
HRegion region = HRegion.createHRegion(info, TEST_UTIL.
getDataTestDir(), TEST_UTIL.getConfiguration(), htd);
try {
List<String> rows = generateRandomWords(100, "row");
List<String> columns = generateRandomWords(10000, "column");
long maxTimestamp = 2;
List<KeyValue> kvList = new ArrayList<KeyValue>();
Map<String, List<KeyValue>> prefixMap = new HashMap<String,
List<KeyValue>>();
prefixMap.put("p", new ArrayList<KeyValue>());
prefixMap.put("s", new ArrayList<KeyValue>());
String valueString = "ValueString";
for (String row: rows) {
Put p = new Put(Bytes.toBytes(row));
p.setWriteToWAL(false);
for (String column: columns) {
for (long timestamp = 1; timestamp <= maxTimestamp; timestamp++) {
KeyValue kv = KeyValueTestUtil.create(row, family, column, timestamp,
valueString);
p.add(kv);
kvList.add(kv);
for (String s: prefixMap.keySet()) {
if (column.startsWith(s)) {
prefixMap.get(s).add(kv);
}
}
}
}
region.put(p);
}
ColumnPrefixFilter filter;
Scan scan = new Scan();
scan.setMaxVersions();
for (String s: prefixMap.keySet()) {
filter = new ColumnPrefixFilter(Bytes.toBytes(s));
scan.setFilter(filter);
InternalScanner scanner = region.getScanner(scan);
List<KeyValue> results = new ArrayList<KeyValue>();
while(scanner.next(results));
assertEquals(prefixMap.get(s).size(), results.size());
}
} finally {
region.close();
region.getLog().closeAndDelete();
}
region.close();
region.getLog().closeAndDelete();
}
@Test
public void testColumnPrefixFilterWithFilterList() throws IOException {
String family = "Family";
HTableDescriptor htd = new HTableDescriptor("TestColumnPrefixFilter");
htd.addFamily(new HColumnDescriptor(family));
HRegionInfo info = new HRegionInfo(htd.getName(), null, null, false);
HRegion region = HRegion.createHRegion(info, TEST_UTIL.
getDataTestDir(), TEST_UTIL.getConfiguration(), htd);
try {
List<String> rows = generateRandomWords(100, "row");
List<String> columns = generateRandomWords(10000, "column");
long maxTimestamp = 2;
List<KeyValue> kvList = new ArrayList<KeyValue>();
Map<String, List<KeyValue>> prefixMap = new HashMap<String,
List<KeyValue>>();
prefixMap.put("p", new ArrayList<KeyValue>());
prefixMap.put("s", new ArrayList<KeyValue>());
String valueString = "ValueString";
for (String row: rows) {
Put p = new Put(Bytes.toBytes(row));
p.setWriteToWAL(false);
for (String column: columns) {
for (long timestamp = 1; timestamp <= maxTimestamp; timestamp++) {
KeyValue kv = KeyValueTestUtil.create(row, family, column, timestamp,
valueString);
p.add(kv);
kvList.add(kv);
for (String s: prefixMap.keySet()) {
if (column.startsWith(s)) {
prefixMap.get(s).add(kv);
}
}
}
}
region.put(p);
}
ColumnPrefixFilter filter;
Scan scan = new Scan();
scan.setMaxVersions();
for (String s: prefixMap.keySet()) {
filter = new ColumnPrefixFilter(Bytes.toBytes(s));
//this is how this test differs from the one above
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(filter);
scan.setFilter(filterList);
InternalScanner scanner = region.getScanner(scan);
List<KeyValue> results = new ArrayList<KeyValue>();
while(scanner.next(results));
assertEquals(prefixMap.get(s).size(), results.size());
}
} finally {
region.close();
region.getLog().closeAndDelete();
}
region.close();
region.getLog().closeAndDelete();
}
List<String> generateRandomWords(int numberOfWords, String suffix) {
Set<String> wordSet = new HashSet<String>();
for (int i = 0; i < numberOfWords; i++) {
int lengthOfWords = (int) (Math.random()*2) + 1;
char[] wordChar = new char[lengthOfWords];
for (int j = 0; j < wordChar.length; j++) {
wordChar[j] = (char) (Math.random() * 26 + 97);
}
String word;
if (suffix == null) {
word = new String(wordChar);
} else {
word = new String(wordChar) + suffix;
}
wordSet.add(word);
}
List<String> wordList = new ArrayList<String>(wordSet);
return wordList;
}
@org.junit.Rule
public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =
new org.apache.hadoop.hbase.ResourceCheckerJUnitRule();
}
編輯:我發現有用的東西。 在ant中,forkmode有一個名為“ perBatch”的選項。 看起來這就是我要的東西。 但是,它在行家中不起作用。 如何找到Maven的相同設置?
是否可以在不同的jvm中運行這兩個測試?
是的,Maven有一個reuseForks
選項。 來自文檔
指示是否可以重用分支的VM。 如果設置為“ false”,則為要執行的每個測試類創建一個新的VM。 如果設置為“ true”,將最多派生forkFork VM,然后將其重新用於執行所有測試。
默認值為true。
用戶屬性是:reuseForks。
您可以像這樣在pom.xml中進行設置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<reuseForks>false</reuseForks> <!-- This will make sure to spawn a fresh jvm for each test -->
</configuration>
</plugin>
編輯
嘗試以下配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
<forkMode>always</forkMode> <!-- try with 'pertest' option as well -->
</configuration>
</plugin>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.