java自动化初始变量_Java 新特性实例之自动化测试

Java 8 开始引入了许多很酷的新特性。实际上,Java 每6个月就会发布一个新版本!这么多新功能,很难跟上更新的脚步。

这些新特性旨在改进 Java 代码冗长的问题,具体方法就是减少样板代码。

下面是自动化测试中用到的 Java 8 至 Java 12 一些新特性,通过Todo示例应用展示。

1. 创建集合

Java 9 为List、Set和Map这样的集合类加入了of()静态工厂方法,让创建列表变得更容易。

在 Java 9 之前,要创建任务列表tasks可以这样做:

List tasks = Arrays.asList("pay mortgage bill", "make dentist appointment", "get car washed");

这段代码看起来并不可怕,比起创建List对象然后循环调用add()方法已经改进了不少。

然而,Java 9 可以用List.of()。不仅可读性更强,依赖的import更少,而且更容易记住:

List tasks = List.of("pay mortgage bill", "make dentist appointment", "get car washed");

使用of()创建集合的一个缺点,创建的集合不可变。这意味着集合创建后不能添加、删除或者排序。

2. 局部变量类型推断

Java 代码冗长其中一个原因是需要显式声明变量或者对象类型。当类型包含范型操作符<>或者类名很长时,代码看起来很枯燥。

Java 10 引入了局部变量类型推断,用var声明变量。使用var必须在声明的时候初始化变量,因为 Java 需要根据赋值语句进行类型推断。

例如,可以用var替代List声明tasks。由于使用List.of()建立字符串列表并赋值,Java 知道tasks的类型是List。

var tasks = List.of( "pay mortgage bill", "make dentist appointment", "get car washed");

我非常钟爱var,这是我最喜欢的 Java 新特性。写 Java 代码从此不再枯燥。尽管如此,还是会提醒自己不要得意忘形,代码的可读性依然很重要。如果程序员自己都不能根据赋值语句判断出类型,那么最好还是直接写上变量类型,让代码变得更清晰易懂。

3. 函数式编程新特性

Java 8 加入了许多函数式编程新特性,比如 lambda 表达式。在集合框架中新加入的forEach()方法中可以使用。

在此之前,可以使用传统的for循环在 Todo 应用中添加task:

var tasks = List.of("pay mortgage bill", "make dentist appointment", "get car washed");

for(int i=0; i

todosPage.addTask(tasks.get(i));

}

也可以使用改进版for循环,看起来简洁了一点:

var tasks = List.of("pay mortgage bill", "make dentist appointment", "get car washed");

for(String task: tasks){

todosPage.addTask(task);

}

Java 8 中的forEach()支持函数式编程,遍历集合更简洁。可以像下面这样遍历list:

tasks.forEach(

forEach()方法内部可以写一个 lambda 表达式。

lambda 表达式以当前集合元素名task开始,变量可以使用1个字母的短名。由于是局部final变量,因此不能在方法外使用。实际开发中会使用t,这里使用了全名。

tasks.forEach(task

接着是->操作符与在元素上执行的操作:

tasks.forEach(task -> todosPage.addTask(task));

实际上,这里只有1个变量与1个待执行的操作。可以用object::method方式来缩短表达式,不用为列表的每个元素声明局部变量,同样的代码可以更简洁:

tasks.forEach(todosPage::addTask);

然而,如果需要对集合中的项目执行多个操作,可以直接在->后面使用大括号

tasks.forEach(task -> {

todosPage.addTask(task);

//TODO: 在 task 上执行更多操作

});

所以,就上面的例子来说,最终代码如下:

var tasks = List.of("pay mortgage bill","make dentist appointment","get car washed");

tasks.forEach(todosPage::addTask);

4. Stream

添加任务后,接下要进行验证。看看如何获取所有task。

Java 8 之前,需要编写代码查找所有WebElement对象,然后循环遍历获取每个task的文本。迭代过程中,需要将String添加到一个新列表然后返回:

public List getAllTasks(){

List elementList = driver.findElements(tasksLocator);

List taskList = new ArrayList();

for(WebElement element : elementList){

taskList.add(element.getText());

}

return taskList;

}

这段代码相当冗长了。幸运的是 Java 8 引入了Stream,处理集合数据变得更简单。

为 WebDriver 的findElements()返回的 Web 元素调用stream()方法:

driver.findElements(tasksLocator).stream()

Stream提供了许多方法可供选择,这里使用map()对集合中的每个元素执行函数,即从元素获取文本,例如WebElement.getText():

driver.findElements(tasksLocator).stream().map(WebElement::getText)

上面的代码会返回应用函数后的结果Stream,其中包含了针对每个元素调用WebElement.getText()后的String值。

这里希望返回String列表,因此调用collect()。

public List getAllTasks(){

return driver.findElements(tasksLocator).stream().map(WebElement::getText).collect(Collectors.toList());

}

可以看到,比起之前的方法代码精简了许多。

5. switch 表达式

Java 12 引入了一种switch新用法。

比如,在代码中进行 API 调用。Java 12 之前,我们会使用switch语句决定调用哪个API:

public static Response execute(String endpoint, HttpMethod method){

Response response = null;

switch(method){

case GET:

response = request.get(endpoint);

break;

case POST:

response = request.post(endpoint);

break;

}

response.then().log().all();

return response;

}

每种情况下,都需要执行一个赋值操作,同时带上一个break语句。

有了 Java 12 带来的switch新用法,可以大大简化代码,可以根据switch处理的结果直接为变量赋值。

以上面的代码为例,可以将每个表达式赋值给response。在switch内部,把:换成->不需要原来的break与default语句:

public static Response execute(String endpoint, HttpMethod method){

Response response = switch(method){

case GET -> request.get(endpoint);

case POST -> request.post(endpoint);

}

response.then().log().all();

return response;

}

完整源代码在 GitHub 上

github.com/angiejones/new-java-features-test-automation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值