栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【selenium4自动化工具的使用以及Junit5单元测试框架】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【selenium4自动化工具的使用以及Junit5单元测试框架】

(点击跳转即可哦)

java学习专栏

LeetCode刷题专栏


文章目录
  • Web自动化——selenium
    • 了解自动化和selenium4
    • selenium的基础语法
      • 定位元素的方法
      • 元素的操作
      • 等待
      • 信息打印
      • 窗口
      • 导航
      • 弹窗
      • 鼠标、键盘的操作
      • 选择框
      • 文件上传
      • 屏幕截图
  • Junit单元测试框架
    • 了解Junit5
    • 基本使用
      • 注解
    • 断言
      • assertEquals(expect,actual)
      • assertNotEquals(expect,actual)
      • assertTrue() 和 assertFalse()
      • assertNull() 和 assertNotNull()
      • assertSame() 和 assertNotSame()
    • 用例的执行顺序
      • 方法的排序
    • 测试套件Suite
      • 指定类,添加到套件中并执行
      • 指定包,添加到套件中并执行
    • 参数化
      • 单参数
      • 多参数 @CsvSource
      • 多参数
      • 动态参数

Web自动化——selenium 了解自动化和selenium4

什么是自动化,为什么要这么做?

答:自动化测试能够代替一部分的手工测试,自动化测试能够提高测试效率。 随着功能的增加,版本越来越多,版本回归的压力也越来越大,所以仅仅通过手工测试 来回归 所有版本 肯定是不现实的,所以我们需要借助自动化来进行回归。


为什么选择selenium作为 我们的web自动化工具?

答:

  1. 开源免费
  2. 支持多浏览器,比如Chrome、Firefox、IE、Edge
  3. 支持多系统,比如Linux、Windows、MacOS
  4. 支持多语言,比如Java、Python
  5. selenium包的底层有很多可以使用的API

环境的部署

selenium工具包——Maven中导入

     
         org.seleniumhq.selenium
         selenium-java
         4.0.0
     

Chrome浏览器

Chromedriver谷歌驱动(注意版本号要一致)

Java版本最低要求8


什么是驱动?驱动的工作原理是什么?

人工测试的情况下,可以手动(驱动)打开浏览器

但是对于自动化来说,代码不能直接打开浏览器,需要借助驱动程序来协助打开浏览器。

selenium、驱动、浏览器三者的联系?


简单的web自动化演示

package com.autochrom;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;

public class Auto {
    public void test() throws InterruptedException {

        ChromeDriver chromeDriver = new ChromeDriver();
        //输入百度网址
        chromeDriver.get("https://www.baidu.com");
        //找到百度搜索框,并输入关键词
//        chromeDriver.findElement(By.xpath("/
    public void clickKuan() throws InterruptedException {
        driver.get("file:///D:/javaStudy/%E6%B5%8B%E8%AF%95%E6%9D%BF%E4%B9%A6/selenium4html/selenium4html/level_locate.html#");
        driver.findElement(By.cssSelector("body > div:nth-child(2) > div > div > a")).click();
        Thread.sleep(1000);
        WebElement web = driver.findElement(By.cssSelector("#dropdown1 > li:nth-child(3) > a"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(web).perform();//鼠标选到这个元素,并显示出来
        driver.findElement(By.cssSelector("#dropdown1 > li:nth-child(3) > a")).click();
        Thread.sleep(1000);
    }

键盘

sendKeys();
选择框

selenium 提供了select接口

select.selectByIndex(3);//通过索引来定位选项,索引从0开始计数
select.selectByValue(“8.34”);//通过value属性来选择

    
    public void choseKuan() throws InterruptedException {
        driver.get("file:///D:/javaStudy/%E6%B5%8B%E8%AF%95%E6%9D%BF%E4%B9%A6/selenium4html/selenium4html/select.html");
        WebElement webElement = driver.findElement(By.cssSelector("#ShippingMethod"));
        Thread.sleep(2000);
        Select select = new Select(webElement);
        select.selectByIndex(3);//通过索引来定位选项,索引从0开始计数
//        select.selectByValue("8.34");//通过value属性来选择
        
        Thread.sleep(2000);
    }
文件上传

页面中点击文件会弹出系统窗口,selenium不能够操作系统窗口。

通过senKey()方法输入我们想要上传的文件路径以及文件名,就能够达到文件上传的一个操作

public void updata() throws InterruptedException {
    driver.get("file:///D:/javaStudy/%E6%B5%8B%E8%AF%95%E6%9D%BF%E4%B9%A6/selenium4html/selenium4html/upload.html");
    WebElement webElement = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
    webElement.sendKeys("D:\图片\Saved Pictures\wallhaven-z8wz2o.jpg");
    Thread.sleep(3000);
屏幕截图

屏幕截图需要用到的依赖


    commons-io
    commons-io
    2.6

代码的执行速度比页面渲染的速度要快

通过截图来留证

//屏幕截图
File srcfile = chromeDriver.getScreenshotAs(OutputType.FILE);
//x 可以选择File Base64  bytes
//将截图文件srcfile保存在指定的路径下
File file = new File("./src/test/java/com/autochrom/pircle/my.png");
FileUtils.copyFile(srcfile,file);

自动的存储到设定的目录下

    //按照时间来生成文件夹名称 和 文件名称
	public List getTime(){
        //文件名格式20220801-214130+毫秒
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HHmmssSS");
        //文件夹名称格式2022-08-01
        SimpleDateFormat sim2 = new SimpleDateFormat("yyyy-MM-dd");

        String filename = sim1.format(System.currentTimeMillis());
        String dirname = sim2.format(System.currentTimeMillis());
        List list = new ArrayList<>();
        list.add(dirname);
        list.add(filename);
        return list;
    }
    
    public void getScreenshot(String str) throws IOException {
        List times = getTime();
        //生成的文件夹路径./src/test/autotest-2022-08-01/goodsbroser-20220801-214130.png
        String filename ="./src/test/autotest-"+times.get(0)+"/"+str+"-"+times.get(1)+".png";
        File srcfile = driver.getScreenshotAs(OutputType.FILE);
        //把屏幕截图放到指定的路径下
        FileUtils.copyFile(srcfile,new File(filename));
    }


Junit单元测试框架 了解Junit5

Java版本最低要求为8

Junit 是一个开源的Java语言的单元测试框架。Java方向使用最广泛的单元测试框架。使用Java开发者都应当学习Junit 并且掌握单元测试的编写。

Junit的依赖


    org.junit.jupiter
    junit-jupiter
    5.8.2
    test


    org.junit.platform
    junit-platform-suite
    1.8.2
    test


    org.junit.platform
    junit-platform-reporting
    1.8.2
    test


基本使用 注解

@Test 表示一个方法/用例

@BeforeEach、@BeforeAll 表示被注解的方法应该在其他方法之前

@BeforeEach : 表示其他方法执行之前都要执行一次

@BeforeAll :表示其他所有方法执行之前只需要执行一遍,使用@BeforeAll注解的方法必须定义为 static

@AfterEach、@AfterAll 表示 被注解节的方法应该在其他方法之后

@AfterEach :其他方法执行之后都要执行一次

@AfterAll : 其他所有方法执行之后只需要执行一次,使用@AfterAll注解的方法必须定义为static


断言

写自动化测试,测试结果分为两种,要么是成功的,要么是失败的

assertEquals(expect,actual)
Assertions.assertEquals(expect,actual);//期望值  比较的值

校验期望值 和 实际值 是否 匹配

assertNotEquals(expect,actual)
Assertions.assertNotEquals(expect,actual);//期望值  比较的值

校验 期望值 和 实际值 是否 匹配

assertTrue() 和 assertFalse()

如果条件的真假与预期相同,程序继续运行,否则抛出异常,不会打印报错信息。参数是boolean类型

assertNull() 和 assertNotNull()

判断一个对象是否为空,如果结果与预期相同,程序继续运行,否则抛出异常。

assertSame() 和 assertNotSame()

判断预期的值和实际的值是否为同一个参数(即判断是否为相同的引用),如果结果与预期相同,程序继续运行,否则抛出异常。

assertSame(expected,actual) 和 assertEquals(expected,actual)的区别;

assertSame(A,B) —> A==B

assertEquals(A,B)—>A.equals(B)


用例的执行顺序 方法的排序

通过@Order()注解 来进行排序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//标注当前类使用方法来进行排序
public class Test{
	@Test
	@Order(1) //明确标注具体的执行顺序
	void pri(){
		...
	}
}

为什么需要用到 Junit里的排序方法?

如果用例之间存在关联关系,那么就是需要手动的指定用例的执行顺序

测试套件Suite 指定类,添加到套件中并执行
@Suite
@SelectClasses({frontPageTest.class,inboundTest.class,goodsbrowseTest.class,driverQuitTest.class})
//按照类的先后顺序进行执行
public class runSuite {
}
指定包,添加到套件中并执行

注意:执行包下面所有以Test命名的文件中 的所有@Test注解的用例

如果包下没有命名 包含Testtests 的文件,则会提示找不到对应的用例

@Suite
@SelectPackages("com.name.name")
//按照类的先后顺序进行执行
public class runSuite {
}
参数化

注意:@Parameterizedtest 标注方法类型为参数化 不需要添加@Test注解了,如果添加了,该用例就会 多执行 一次

需要添加参数的来源

单参数

@ValueSource(类型={参数1,参数2})

类型使用原生类型:int double 常见的都可以使用

@ParameterizedTest
@ValueSource(String = {"名字","名字","名字"})
void my(String name){
    System.out.println("name:" + name);
}
多参数 @CsvSource
@ParameterizedTest
@CsvSource(value = {"名字,10","名字,20"})
void prin(String name,int age){
    System.out.println("name:" + name + " age:" + age);
}

手动指定分隔符(指定 delimiterString)

@ParameterizedTest
@CsvSource(value = {"名字-10","名字-20"},delimiterString = "-")
void prin(String name,int age){
    System.out.println("name:" + name + " age:" + age);
}
@CsvSource(value = {"'名,字',20"})
//如果参数中包含逗号,就需要 使用单引号('')作为 转义字符
多参数

如果参数非常的多,在代码中 编写不太好看,就可以 借助 文件 注入的方式来添加。

@CsvSource(指定文件路径)

指定文件路径为 当前项目下 resources 文件 中 csv 文件

@ParameterizedTest
@CsvFileSource(resources = "/my.csv")
void prin(String name,int age){
    System.out.println("name:" + name + " age:" + age);
}

指定文件路径为本地任意文件夹下的csv文件

@ParameterizedTest
@CsvFileSource(files = "D:\file\my.csv")
void prin(String name,int age){
    System.out.println("name:" + name + " age:" + age);
}
动态参数

单参数: @MethodSource(“”) 参数为 数据来源的方法名

如果不指定数据来源,则默认找跟用例同名的静态方法

@ParameterizedTest
@MethodSource("meth")
void dyTest(String x){
    System.out.println(x);
}
static Stream meth(){
    return Stream.of("参数1","参数2");
}

多参数

@ParameterizedTest
@MethodSource
void dyTest(String x,int age){
    System.out.println( x + age);
}
static Stream dyTest(){
            return Stream.of(Arguments.arguments("11",3),
                Arguments.arguments("22",4);

}

要是对大家有所帮助的话,请帮我点个赞吧。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035843.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号