自动化测试

自动化测试

码农世界 2024-05-23 前端 63 次浏览 0个评论

文章目录

  • 前言
  • 一、什么是自动化测试?
    • 一个简单的自动化实例
    • 二、自动化测试的分类
      • 1.接口自动化测试
      • 2.UI自动化测试(界面测试)
        • 移动端自动化测试
        • web端自动化测试(主要学习)
        • 三、selenium工具
          • 1.为什么选择selenium作为web自动化测试工具?
          • 2.环境部署
          • 3.什么是驱动?
          • 4.selenium的常用方法
            • 基本方法
            • 如何处理弹窗?
            • 如何处理选择框?
            • 执行脚本
            • 文件上传
            • 无头模式
            • 四、JUnit
              • 1.注解
              • 2.断言
              • 3.执行顺序
              • 五、测试套件

                前言

                自动化测试有效的减少人力的投入,同时提高了测试的质量和效率,这里记录了什么是自动化、自动化测试的分类、selenium工具的使用等。


                一、什么是自动化测试?

                通过自动化测试可以有效的减少人力的投入,同时提高了测试的质量和效率。例如:回归测试的时候,由于版本越来越多,仅仅是人工测试是不现实的,所以需要使用自动化测试。

                一个简单的自动化实例

                (1)创建驱动实例,创建会话;

                (2)访问网站;

                (3)查找元素;

                (4)操作元素;

                (5)结束会话。

                代码如下(示例):

                        ChromeDriver chromeDriver = new ChromeDriver();
                        Thread.sleep(3000);
                        //在浏览器中输入B站的网址,访问B站首页
                        chromeDriver.get("https://www.bilibili.com");
                        Thread.sleep(3000);
                        //找到B站首页输入框元素,并输入天官赐福
                        chromeDriver.findElement(By.cssSelector(".nav-search-input")).sendKeys("天官赐福");
                        Thread.sleep(3000);
                        //并点击查询
                        chromeDriver.findElement(By.cssSelector(".nav-search-btn")).click();
                        Thread.sleep(3000);
                        //会话结束
                        chromeDriver.quit();
                

                二、自动化测试的分类

                1.接口自动化测试

                2.UI自动化测试(界面测试)

                移动端自动化测试

                web端自动化测试(主要学习)

                使用selenium工具来进行web端自动化测试。

                三、selenium工具

                1.为什么选择selenium作为web自动化测试工具?

                (1)开源免费;

                (2)支持多浏览器;

                (3)支持多系统;

                (4)支持多语言;

                (5)selenium包提供了很多可供测试使用的API。

                2.环境部署

                如果想要使用selenium实施web自动化测试,需要的环境是:

                (1)如果是Chrome浏览器,则下载ChromeDriver;

                (2)selenium工具包;

                (3)如果语言选择的是java,则java版本最低要求8。

                3.什么是驱动?

                人工测试的情况下,人来打开浏览器,那么驱动就是人力;自动化来说,代码是不能直接打开浏览器,需要借助驱动程序才能打开浏览器。

                4.selenium的常用方法

                基本方法

                (1)查找页面元素:findElement()、findElements()

                参数:By类(提供通过什么方式来查找元素)

                返回值:List

                (2)元素的定位

                        1)选择器selector

                              基础选择器

                              复合选择器

                        功能:选择页面的指定元素。

                        2)xpath的语法

                             层级:子集/、跳级//

                             属性:@

                             函数:contains()

                自动化里要求元素的定位要唯一,但是手动在页面复制selector或者xpath元素不一定是唯一的,需要自己进行手动修改到唯一。

                (3)输入文本:sendKeys();

                (4)点击:click();

                        ChromeDriver driver = new ChromeDriver();
                        //1.获取测试的网页地址
                        driver.get("http://www.bilibili.com");
                        //2.通过选择器进行选择 哔哩哔哩 的搜索框 并输入 关键词 自动化测试
                        driver.findElement(By.cssSelector(".nav-search-input")).sendKeys("自动化测试");
                        //3.获取搜索的点击按钮并点击
                        driver.findElement(By.cssSelector(".nav-search-btn")).click();
                        //4.搜索完成后关闭资源
                        driver.quit();
                

                (5)提交:submit();(通过回车键提交,仅适用于表单元素)

                driver.findElement(By.cssSelector(".nav-search-btn")).submit();
                

                注:不推荐使用submit,因为submit仅适用于表单

                (6)清除:clear();

                driver.findElement(By.cssSelector("#kw")).clear();
                

                (7)获取文本:String getText();

                String tmp = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]")).getText();
                

                (8)获取属性值:getAttribute();

                         属性对应的值。

                String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");
                

                (9)获取页面标题:getTitle();

                         获取页面URL:getCurrentUrl();

                driver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
                driver.findElement(By.cssSelector("#su")).click();
                System.out.println(driver.getTitle());
                System.out.println(driver.getCurrentUrl());
                

                (10)窗口

                driver.manage().window()

                1)窗口最大化:maximize();

                2)窗口最小化:minimize();

                3)全屏:fullscreen();

                4)手动设置大小:setSize(new Dimension(width,height));

                        //窗口最大化
                        driver.manage().window().maximize();
                        //窗口最小化
                        driver.manage().window().minimize();
                        //窗口全屏
                        driver.manage().window().fullscreen();
                        //手动设置窗口大小
                        driver.manage().window().setSize(new Dimension(1024,1024));
                

                5)窗口的切换:当浏览器每打开一个标签页面时,会自动的给每个标签进行标识(句柄),获取所有标签的句柄:getWindowHandles();

                获取当前页面的句柄:getWindowHandle();

                窗口的切换:switchTo().window(handle);

                        driver.get("https://www.baidu.com");
                        //找到百度页面的 图片 并点击进其页面
                        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)")).click();
                        //此时会有两个页面
                        //获取所有页面的句柄
                        Set handles = driver.getWindowHandles();
                        //获取当前页面的句柄
                        String handle = driver.getWindowHandle();
                        //实现窗口的切换
                        for(String s : handles) {
                            //切换到图片页面
                            if(!s.equals(handle)) {
                                driver.switchTo().window(s);
                            }
                        }
                        //测试是否切换成功
                        driver.findElement(By.cssSelector("#wrapper_head_box > div > div > div > div > div.s_nav > a > img"));
                        driver.quit();
                

                (11)屏幕截图

                X getScreenshotAs(OutputType.X);

                        driver.get("https://www.baidu.com");
                        driver.findElement(By.cssSelector("#kw")).sendKeys("敖瑞鹏");
                        driver.findElement(By.cssSelector("#su")).click();
                        //查看是否到敖瑞鹏页面
                        //由于代码执行过快,页面还未渲染,所以会出现找不到改元素的错误,使用截图保存当时现场情况
                //        //给页面一些渲染时间
                //        Thread.sleep(3000);
                        //屏幕截图(保存现场)
                        File srcfile = driver.getScreenshotAs(OutputType.FILE);
                        //把屏幕截图保存到指定文件路径下
                        FileUtils.copyFile(srcfile,new File("./src/test/java/com/autotest0304/screen.png"));
                        driver.findElement(By.cssSelector("#\\34  > div > div > h3 > a > em"));
                        
                        driver.quit();
                

                (12)等待

                1)强制等待:程序阻塞进行(Thread.sleep();)

                2)隐式等待:隐式等待会作用于driver的整个生命周期。

                        //添加隐式等待,会作用于driver的整个生命周期
                        //隐式等待会一直轮询判断元素是否存在,如果不存在就在等待设置好的时间里不断的进行轮询,直到元素能够被找到
                        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
                

                3)显示等待:作用于某一条。

                        //添加显示等待
                        new WebDriverWait(driver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#\\34  > div > div > h3 > a > em")));
                

                4)流畅等待

                (13)浏览器导航

                1)浏览器的前进

                driver.navigate().forward();

                2)浏览器的后退

                driver.navigate().back();

                3)浏览器的刷新

                driver.navigate().refresh();

                        //获取到百度搜索页面
                        //driver.get("https://www.baidu.com");
                        driver.navigate().to("https://www.baidu.com");
                        //浏览器回退
                        driver.navigate().back();
                        //浏览器前进
                        driver.navigate().forward();
                        //浏览器刷新
                        driver.navigate().refresh();
                

                (14)弹窗

                1)警告弹窗

                2)确认弹窗

                3)提示弹窗

                如何处理弹窗?

                步骤:1.将driver对象作用到弹窗上(切换带弹窗)

                Alert alert = driver.switchTo.alert();

                2.选择确认/取消(提示弹窗输入文本)

                确认alert.accept();

                取消alert.dismiss();

                输入文本sendKeys();(在页面上看不见弹窗中输入文本的效果,但实际是输入了的)

                注意:

                虽然警告弹窗只有确认按钮,但是accept和dismiss都能处理;

                虽然警告弹窗和确认弹窗没有输入文本的地方,但如果要执行也不会报错。

                        //切换到弹窗进行弹窗处理
                        Alert alert = driver.switchTo().alert();
                        //1.弹窗输入文本
                        alert.sendKeys("弹窗输入文本");
                        //2.点击确认
                        alert.accept();
                        //3.点击取消
                        alert.dismiss();
                

                如何处理选择框?

                选项的选择方式:

                1.根据文本来选择

                2.根据属性值来选择

                3.根据序号来选择

                步骤:

                1.创建选择框对象

                Select select = new Select(WebElement);

                2.根据文本/属性值/序号选择

                select.selectByVisibleText();

                select.selectByValue();

                select.selectByIndex();

                        WebElement element = driver.findElement(By.cssSelector("body > table > tbody > tr:nth-child(3) > td:nth-child(2) > select:nth-child(1)"));
                        //先创建选择框对象
                        Select select = new Select(element);
                        Thread.sleep(3000);
                        //1.根据文本来选择
                        select.selectByVisibleText("1992");
                        //2.根据属性值来选择--value的值
                        //select.selectByValue("");
                        //3.根据序号来选择--序号从0开始
                        //select.selectByIndex(1);
                        Thread.sleep(3000);
                

                执行脚本

                executeScript()

                        //执行js命令,让页面置顶或置低
                        //置低
                        driver.executeScript("document.documentElement.scrollTop=500");
                        //置顶
                        driver.executeScript("document.documentElement.scrollTop=0");
                

                文件上传

                        driver.findElement(By.cssSelector("")).sendKeys("文件路径+文件");
                

                无头模式

                        ChromeOptions options = new ChromeOptions();
                        options.addArguments("-headless");
                        ChromeDriver driver = new ChromeDriver(options);
                        driver.get("https://www.baidu.com/");
                        driver.findElement(By.cssSelector("#kw")).sendKeys("山河令");
                        driver.findElement(By.cssSelector("#su")).click();
                        driver.close();
                

                四、JUnit

                1.注解

                (1)@Test

                表示方法是测试方法,执行当前这个类时,会自动的执行该类下所有带@Test注解的用例。

                (2)@BeforeEach

                当前的方法需要在每个用例执行之前都执行一次。

                (3)@BeforeAll

                当前的方法需要在当前类下所有用例之前执行一次,被该注解修饰的方法必须为静态方法。

                (4)@AfterEach

                当前的方法需要在每个用例执行之后都执行一次。

                (5)@AfterAll

                当前的方法在当前类下所有的用例执行之后执行一次,被该注解修饰的方法必须为静态方法。

                public class JunitTest {
                    @BeforeEach
                    public void first() {
                        System.out.println("head");
                    }
                    @BeforeAll
                    public static void beforeAll() {
                        System.out.println("beforeAll");
                    }
                    @Test
                    public void Second() {
                        System.out.println("bbb");
                    }
                    @Test
                    public void third() {
                        System.out.println("ccc");
                    }
                    @AfterEach
                    public void last() {
                        System.out.println("last");
                    }
                    @AfterAll
                    public static void afterAll() {
                        System.out.println("afterAll");
                    }
                }
                

                2.断言

                (1)断言匹配/不匹配

                Assertions.assertEquals();

                Assertions.assertNotEquals();

                (2)断言为真/假

                Assertions.assertTrue();

                Assertions.assertFalse();

                (3)断言结果为空/不为空

                Assertions.assertNull();

                Assertions.assertNotNull();

                3.执行顺序

                (1)通过order注解来排序

                不加order注解,其执行顺序是无序的。

                使用order注解,设置其执行顺序。

                注:这里的@Test不能去掉。

                (2)参数化方法

                尽可能的通过一个用例,多组参数来模拟用户的行为。

                在使用参数化注解之前需要先声明该方法为参数化方法@ParameterizedTest

                单参数

                @ValueSource()

                支持的数据类型有short、byte、int、long、float、double、char、boolean、java。lang.String、java.lang.Class。

                    //单参数
                    @ParameterizedTest
                    @ValueSource(strings = {"aaa","bbb","ccc"})
                    public void singleParameter(String name) {
                        System.out.println(name);
                    }
                

                多参数

                @CsvSource()

                    //多参数
                    @ParameterizedTest
                    @CsvSource({"aaa,100","bbb,30","ccc,20"})
                    public void Parameters(String name,int age) {
                        System.out.println("姓名:"+name+" ,年龄:"+age);
                    }
                

                @CsvFileSource()

                    //多参数--从第三方CSV文件读取数据源
                    @ParameterizedTest
                    @CsvFileSource(files = "D:\\Book\\csv.csv")
                    public void parametersByFile(String name,int age) {
                        System.out.println("姓名:"+name+";年龄:"+age);
                    }
                

                动态方法

                @MethordSource()

                    //动态方法
                    @ParameterizedTest
                    @MethodSource("methodeParameter")
                    public void dynamicParameter(String name,int age) {
                        System.out.println("姓名:"+name+";年龄:"+age);
                    }
                    static Stream methodeParameter() throws InterruptedException {
                        String[] arr = new String[5];
                        for (int i = 0; i < arr.length; i++) {
                            Thread.sleep(1000);
                            arr[i] = System.currentTimeMillis()+"";
                        }
                        return Stream.of(
                                Arguments.arguments(arr[0],10),
                                Arguments.arguments(arr[1],10),
                                Arguments.arguments(arr[2],10),
                                Arguments.arguments(arr[3],10),
                                Arguments.arguments(arr[4],10)
                        );
                    }
                

                注:使用参数化注解的方法就不能再用@Test注解。

                五、测试套件

                1.指定类名来运行所有的用例

                @Suite

                @SelectClasses()

                想要运行的用例必须要被@Test注解(除参数化的用例)

                2.指定包名来运行包下所有的用例

                @Suite

                @SelectPackages()

                如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾。

转载请注明来自码农世界,本文标题:《自动化测试》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,63人围观)参与讨论

还没有评论,来说两句吧...

Top