上篇文章提到了数据驱动可以在几个方面进行:
下面将详细解说如何进行数据驱动。
5. 数据驱动
5.1 测试数据的数据驱动
5.1.1 Junit5的 参数化
说到测试数据的数据驱动,就必然离不开测试框架的参数化,毕竟测试数据是传给用例的,用例是由框架来管理的,这里以目前最推荐使用的Junit5框架为例,介绍参数化的使用
@ParameterizedTest+@ValueSource参数化
在Junit5中,提供了@ParameterizedTest
注解来实现方法的参数化设置,另外@ValueSource
注解用来存放数据,写法如下:
@ParameterizedTest
@ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
assertTrue(StringUtils.isPalindrome(candidate));
}
@ParameterizedTest+@CsvSource参数化
Junit5还提供了@CsvSource
注解来实现csv
格式的参数传递,写法如下:
@ParameterizedTest
@CsvSource({
"滴滴,滴滴出行",
"alibaba,阿里巴巴",
"sougou,搜狗"
})
public void searchStocks(String searchInfo,String exceptName) {
String name = searchpage.inputSearchInfo(searchInfo).getAll().get(0);
assertThat(name,equalTo(exceptName));
}
@ParameterizedTest+@CsvFileSourc数据驱动
最终,Junit5提供了@CsvFileSourc
注解来实现csv数据格式的数据驱动,可以传递csv
文件路径来读取数据,写法如下:
-
csv数据文件:
pdd
xiaomi
pdd
-
用例实现:
@ParameterizedTest
@CsvFileSource(resources = "/data/SearchTest.csv")
void choose(String keyword){
ArrayList<String> arrayList = searchPage.inputSearchInfo(keyword).addSelected();
}
对于简单的数据结构,可以使用CSV,上面也说过,较为复杂的数据结构,推荐使用yaml,接下来看如何用yaml文件完成测试数据驱动。
@ParameterizedTest+@MethodSource参数化
-
先来看Junit5提供的另一个注解——
@MethodSource
,此注解提供的方法是我们做测试数据驱动的核心,它可以让方法接收指定方法的返回值作为参数化的入参,用法是在注解的括号中填入数据来源的方法名,具体用法如下:
@ParameterizedTest
@MethodSource("stringProvider")
void testWithExplicitLocalMethodSource(String argument) {
assertNotNull(argument);
}
static Stream<String> stringProvider() {
return Stream.of("apple", "banana");
}
@ParameterizedTest+@MethodSource参数化 + jackson yaml数据驱动
有了@MethodSource
的参数化支持,我们就可以在方法中利用jackson
库对yaml
文件进行数据读取,从而完成数据驱动了
-
现有如下yaml数据文件,我需要取出testdata中的测试数据
username: 888
password: 666
testdata:
滴滴: 滴滴出行
alibaba: 阿里巴巴
sougou: 搜狗
-
创建
Config
类:
import java.util.HashMap;
public class Config {
public String username;
public String password;
public HashMap<String,String> testdata = new HashMap<>();
}
-
创建
Config
对象,与yaml
文件建立映射关系,读取数据,通过@MethodSource
完成数据的参数化传递
public class TestSteps {
@ParameterizedTest
@MethodSource("YamlData")
public void search(String searchInfo,String exceptName) {
String name = searchpage.inputSearchInfo(searchInfo).getAll().get(0);
assertThat(name,equalTo(exceptName));
}
static Stream<Arguments> YamlData() throws IOException {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Config data = mapper.readValue(Config.class.getResourceAsStream("/demo2.yaml"), Config.class);
List<Arguments> list = new ArrayList<>();
Arguments arguments = null;
for (String key : data.testdata.keySet()) {
Object value = data.testdata.get(key);
arguments = arguments(key, value);
list.add(arguments);
}