Большая гибкость, так или иначе, означает, что писать сложнее и проще, особенно в большинстве случаев тестовый пример довольно статичен, но не настолько динамичен.
Предположим, я хочу проверить Math.add()
:
Параметризованная версия теста выглядит следующим образом:
@ParameterizedTest
@CsvSource({ "1,1,2",
"2,2,4",
"3,3,6",
"4,4,8",
"5,5,10",
"6,6,12",
"7,7,14",
"10,90,100" })
public void parameterizedTest(int left, int right, int expected) {
assertEquals(expected, Math.addExact(left, right));
}
Динамическая версия теста выглядит следующим образом:
@TestFactory
Collection<DynamicTest> dynamicTest() {
return Arrays.asList(
DynamicTest.dynamicTest("Test1", () -> assertEquals(2, Math.addExact(1, 1))),
DynamicTest.dynamicTest("Test2", () -> assertEquals(4, Math.addExact(2, 2))),
DynamicTest.dynamicTest("Test3", () -> assertEquals(6, Math.addExact(3, 3))),
DynamicTest.dynamicTest("Test4", () -> assertEquals(8, Math.addExact(4, 4))),
DynamicTest.dynamicTest("Test5", () -> assertEquals(10, Math.addExact(5, 5))),
DynamicTest.dynamicTest("Test6", () -> assertEquals(12, Math.addExact(6, 6))),
DynamicTest.dynamicTest("Test7", () -> assertEquals(14, Math.addExact(7, 7))),
DynamicTest.dynamicTest("Test8", () -> assertEquals(100, Math.addExact(10, 90))));
}
У него уже есть много шаблонных кодов. Поэтому я пытаюсь использовать return Stream<DynamicTest>
для удаления этих шаблонных кодов:
@TestFactory
Stream<DynamicTest> dynamicTest2() {
return Stream.of(
"1,1,2",
"2,2,4",
"3,3,6",
"4,4,8" ,
"5,5,10" ,
"6,6,12" ,
"7,7,14",
"10,90,100")
//How to do????????
.map(data-> DynamicTest.dynamicTest(data, () -> assertEquals(xxx, Math.addExact(yy,zz))));
}
Но как я могу преобразовать мои тестовые данные в формате строки в аргументы и вызвать SUT. Я оглядываюсь по DynamicTest
API, чтобы увидеть, может ли что-нибудь помочь мне, но не могу найти ничего полезного, поэтому я сдаюсь .....
Причина, по которой ваш код не работает, заключается в том, что IE анализирует HTML и переводит теги в верхний регистр, когда вы читаете его через innerHTML. Например, если у вас есть такой HTML:
<div id='box'>
Hello<br>
World
</div>
А затем вы используете этот Javascript (в IE):
alert(document.getElementById('box').innerHTML);
Вы получите окно предупреждения со следующим:
Hello<BR>World
Обратите внимание на
теперь в верхнем регистре. Чтобы исправить это, просто добавьте флаг
i
в дополнение к флагу g
, чтобы регулярное выражение не учитывало регистр, и оно будет работать так, как вы ожидаете.
Вместо
/<br.*?>/
вы можете попробовать
/<br[^>]*>/
, т. Е. Сопоставить "
, за которыми следуют любые символы, кроме '>'
, затем '>'
.
Ну, к сожалению, у меня нет большого количества браузеров на работе (только IE - вздох), но я сразу вижу способ оптимизировать ваше регулярное выражение:
T = captions.innerHTML.split(/<br[^>]*?>/g);
встроенное определение класса символов [^>] указывает выражению совпадать с любым символом, КРОМЕ знака больше чем. Вы также можете сделать это без учета регистра (передайте gi в конце, а не просто g).
<\ s br \ s /? \ S *>
соответствует
<br>, <br />, < br >,<br / >
Я тестировал здесь в IE.6. Если с маршем все в порядке, то js может его разделить в соответствии с регулярным выражением.
Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно проанализировать XML и HTML с помощью регулярного выражения? , почему). Что вам нужно, это HTML-парсер. См. . Можете ли вы привести пример парсинга HTML с вашим любимым парсером? для примеров использования различных парсеров.
В частности, вас может заинтересовать ответ JavaScript + DOM .
Проверено в Firefox 3 и IE7:
/<br.*?>/gi
Попробуйте сами здесь: http://jsbin.com/ofoke
var input = "one <br/>\n"
+ "two <br />\n"
+ "three <br>\n"
;
alert(input.replace(/<br.*?>/gi, ''));