测试开发 | Junit5 + YAML 轻松实现参数化和数据驱动,让 App 自动化测试更高效(二)
本文为霍格沃兹测试学院优秀学员课程学习笔记,想一起系统进阶的同学文末加流。
上篇文章提到了数据驱动可以在几个方面进行:
测试数据的数据驱动
测试步骤的数据驱动
定位符
行为流
断言的数据驱动
下面将详细解说如何进行数据驱动。
5. 数据驱动
5.1 测试数据的数据驱动
5.1.1 Junit5的 参数化
说到测试数据的数据驱动,就必然离不开测试框架的参数化,毕竟测试数据是传给用例的,用例是由框架来管理的,这里以目前最推荐使用的Junit5框架为例,介绍参数化的使用
2023-02-28 08:00发表于安徽
霍格沃兹测试学院
@ParameterizedTest+@ValueSource参数化
在Junit5中,提供了@ParameterizedTest 注解来实现方法的参数化设置,另外@ValueSource 注解用来存放数据,写法如下:
@ParameterizedTest+@CsvSource参数化
Junit5还提供了@CsvSource 注解来实现csv 格式的参数传递,写法如下:
@ParameterizedTest+@CsvFileSourc数据驱动
最终,Junit5提供了@CsvFileSourc 注解来实现csv数据格式的数据驱动,可以传递csv 文件路径来读取数据,写法如下:
csv数据文件:软件测试app
1
2
3
4
5@ParameterizedTest @ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })void palindromes(String candidate) { assertTrue(StringUtils.isPalindrome(candidate));}
1
2
3
4
5
6
7
8
9
10@ParameterizedTest @CsvSource({ "滴滴,滴滴出行", "alibaba,阿里巴巴", "sougou,搜狗"})public void searchStocks(String searchInfo,String exceptName) { String name = searchpage.inputSearchInfo(searchInfo).getAll().get(0); assertThat(name,equalTo(exceptName));}
1
2
3pdd xiaomi pdd
用例实现:
对于简单的数据结构,可以使用CSV,上面也说过,较为复杂的数据结构,推荐使用yaml,接下来看如何用yaml文件完成测试数据驱动。
@ParameterizedTest+@MethodSource参数化
先来看Junit5提供的另一个注解——@MethodSource ,此注解提供的方法是我们做测试数据驱动的核
心,它可以让方法接收指定方法的返回值作为参数化的入参,用法是在注解的括号中填入数据来源的方法名,具体用法如下:
@ParameterizedTest+@MethodSource参数化 + jackson yaml数据驱动
有了@MethodSource 的参数化支持,我们就可以在方法中利用jackson 库对yaml 文件进行数据读取,从而完成数据驱动了
现有如下yaml数据文件,我需要取出testdata中的测试数据
1
2
3
4
5@ParameterizedTest @CsvFileSource(resources = "/data/SearchTest.csv")void choose(String keyword){ArrayList<String> arrayList = searchPage.inputSearchInfo(keyword).addSelected(}
1
2
3
4
5
6
7
8
9@ParameterizedTest @MethodSource("stringProvider")void testWithExplicitLocalMethodSource(String argument) { assertNotNull(argument);
}static Stream<String> stringProvider() { return Stream.of("apple", "banana");}1 username: 888
创建Config 类:
创建Config 对象,与yaml 文件建立映射关系,读取数据,通过@MethodSource 完成数据的参数化传递
2
3
4
5
6 password: 666 testdata: 滴滴: 滴滴出行 alibaba: 阿里巴巴 sougou: 搜狗
1
2
3
4
5
6
7import java.util.HashMap;public class Config { public String username; public String password; public HashMap<String,String> testdata = new HashMap<>();}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class TestSteps { @ParameterizedTest @MethodSource("YamlData") public void search(String searchInfo,String exceptName) { String name = searchpage.inputSearchInfo(searchInfo).getAll().ge assertThat(name,equalTo(exceptName)); } static Stream<Arguments> YamlData() throws IOException { ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); Config data = adValue(ResourceAsStream("/de List<Arguments> list = new ArrayList<>(); Arguments arguments = null; for (String key : stdata.keySet()) { Object value = (key);
5.2 测试步骤的数据驱动
对于测试步骤的数据驱动主要针对两点:
定位符:我们做App自动化的时候可以把定位符合定位器直接写在PO中,也可以将其剥离出
注:测试步骤的数据驱动是指把PO中变化的量剥离出来,不是对用例里的调用步骤进行封装。在上面已经提到过不要在测试用例内完成大量的数据驱动:用例通过PO的调用是能够非常清晰展现出业务执行场景的,业务才是用例的核心;
一旦在用例里使用了大量数据驱动,如调用各种 yaml、csv 等数据文件,会造成用例可读性变差,维护复杂度变高;
5.2.1 设计思路
首先来考虑我们的剥离到yaml 中的数据结构
做测试步骤的数据局驱动我们希望可以将一个用例中的步骤方法清晰的展示出来,在对应的方法中包括了方法对应的定位符和行为流,这样能和PO中的结构保持一致,更易读易维护;如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class SearchPage extends BasePage { //定位符 private By inputBox = By.id("search_input_text"); private By clickStock = By.id("name"); private By cancel = By.id("action_close"); //行为流 //搜索股票 public SearchPage search (String sendText){ sendKeys(inputBox,sendText); click(clickStock); return this ; } //取消返回 public App cancel (){ click(cancel); return new App(); }}
1
2search: steps:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论