自动化测试项目实战

news2024/12/25 0:53:03

目录

1.熟悉项目

2.针对核心流程设计手工测试用例

3.手工测试用例转换为自动化测试用例

前置工作 

测试工作

登陆界面

博客列表页数量

博客详情页检验

写博客并发布

 校验标题,时间

删除博客

注销博客 


针对博客系统进行自动化测试

1.熟悉项目

2.针对核心流程设计手工测试用例

3.手工测试用例转换为自动化测试用例

前置工作 

初始化工作:@BeforeAll   创建驱动

退出工作:@AfterAll    退出浏览器

public class InitAndEnd {
    static WebDriver webDriver;
    @BeforeAll
    static void SetUp(){
        webDriver = new ChromeDriver();
    }
    @AfterAll
    static void TearDown(){
        webDriver.quit();
    }
}

测试工作

登陆界面

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.By;

import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

public class BlogCases extends InitAndEnd{
    /*
    输入正确的账号密码,登陆成功
     */
    @ParameterizedTest
    @CsvFileSource(resources = "LoginCSv.csv")
    void LoginSuccess(String username,String password,String blogList_URL){
        //打开博客登录页面
        webDriver.get("http://localhost:8080/login.html");
//        sleep(3000);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        //输入账号zhangsan
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        //输入密码123456
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        //点击提交按钮
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#submit")).click();
        //跳转到列表页,获取URL,如果url为列表页面的,测试通过,否则不通过
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals(blogList_URL,cur_url);
    }
}

 

 错误情况

博客列表页数量

  /*
    博客数量
     */
    @Test
    void BlogList() {
        //打开博客列表页
        webDriver.get("http://localhost:8080/myblog_list.html");
        //获取页面所有博客标题对应的元素
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        int title_num = webDriver.findElements(By.cssSelector(".title")).size();
        //元素数量为0测试不通过
        Assertions.assertNotEquals(0,title_num);
    }

博客详情页检验

url 博客标题 详情页title是否是博客详情页

    /*
       博客详情页检验
       url
       博客标题
       详情页title是否是博客详情页
     */
    @ParameterizedTest
    @MethodSource("Generator")
    void BlogDetail(String expected_url,String expected_title,String expected_blog_title){
        //找到第一篇博客的查看全文按钮
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.xpath("//*[@id=\"articleList\"]/div[1]/a[1]")).click();
        //获取url
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_url = webDriver.getCurrentUrl();
        //获取当前页面title
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_title = webDriver.getTitle();
        //获取博客标题
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_blog_title = webDriver.findElement(By.cssSelector("#title")).getText();
        //断言
        Assertions.assertEquals(expected_url,cur_url);
        Assertions.assertEquals(expected_title,cur_title);
        Assertions.assertEquals(expected_blog_title,cur_blog_title);


    }
    public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments("http://localhost:8080/blog_content.html?id=10",
                "博客详情页","Java数据结构基础——泛型、通配符"));
    }

写博客并发布

    @Order(3)
    @Test
    void EditBolg(){
        //点击写博客按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        //输入标题,通过Jscript也能输入
        webDriver.findElement(By.cssSelector("#title")).sendKeys("软件测试");
        //点击发布
        webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
    }

 校验标题,时间

    @Order(3)
    @Test
    void BlogInfoChecked() throws InterruptedException {
        webDriver.get("http://localhost:8080/blog_list.html");
        sleep(3000);
        //获取第一篇文章标题
        String cur_blog_title =  webDriver.findElement(By.cssSelector("#articleList > div:nth-child(1) > div.title")).getText();
        //获取博客发布时间
        sleep(3000);
        String cur_blog_time= webDriver.findElement(By.xpath("//*[@id=\"articleList\"]/div[1]/div[2]")).getText();
        //判断
        Assertions.assertEquals("软件测试",cur_blog_title);
        if(cur_blog_time.equals("2023-07-20")){
            System.out.println("测试通过");
        }else {
            System.out.println("测试不通过");
        }
    }

删除博客

并确认是否删除成功,第一篇文章是否已经改变

@Order(3)
    @Test
    void deleteBlog() throws InterruptedException {
        webDriver.get("http://localhost:8080/myblog_list.html");
        //点击第一篇文章删除按钮
        webDriver.findElement(By.xpath("//*[@id=\"articleList\"]/div[1]/a[3]")).click();
        //确认删除
        webDriver.switchTo().alert().accept();
//        webDriver.findElement(By.xpath("//*[@id=\"articleList\"]/div[1]/div[1]")).click();
        //删除成功确认
        sleep(3000);//确认
        webDriver.switchTo().alert().accept();
        //获取第一篇文章是否是Java数据结构基础——泛型、通配符
        String cur_blog_title = webDriver.findElement(By.cssSelector("#articleList > div:nth-child(1) > div.title")).getText();
        //断言
        Assertions.assertEquals("Java数据结构基础——泛型、通配符",cur_blog_title);
    }

注销博客 

并判断是否跳转到登陆页面,输入框是否清空 

   /*
    注销博客
     */
    @Test
    @Order(3)
    void exit(){
        //注销操作
        webDriver.get("http://localhost:8080/myblog_list.html");
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        webDriver.switchTo().alert().accept();
        //是否跳转到登陆页面
        //获取url
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_url = webDriver.getCurrentUrl();
        //判断
        Assertions.assertEquals("http://localhost:8080/login.html",cur_url);
        //判断输入框是否为空
        String input_name = webDriver.findElement(By.cssSelector("#username")).getText();
        String input_pwd = webDriver.findElement(By.cssSelector("#password")).getText();
        Assertions.assertEquals("",input_name);
        Assertions.assertEquals("",input_pwd);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年9月北京/广州/深圳CDGA/CDGP认证考试报名开启

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…

AlSD 系列智能安全配电装置是安科瑞电气有限公司专门为低压配电侧开发的一款智能安全用电产 品-安科瑞黄安南

一、应用背景 电力作为一种清洁能源&#xff0c;给人们带来了舒适、便捷的电气化生活。与此同时&#xff0c;由于使用不当&#xff0c;维护 不及时等原因引发的漏电触电和电气火灾事故&#xff0c;也给人们的生命和财产带来了巨大的威胁和损失。 为了防止低压配电系统发生漏…

数据结构和算法——表排序(算法概述、物理排序、复杂度分析,包含详细清晰图示过程)

目录 算法概述 物理排序 复杂度分析 算法概述 表排序用于 待排元素都为一个庞大的结构&#xff0c;而不是一个简单的数字&#xff0c;例如&#xff1a;一本书&#xff0c;一部电影等等。 如果这些待排元素都用之前的排序方法&#xff0c;元素需要频繁互换&#xff0c;那么…

uniapp 即时通讯开发流程详解

今天我将为您详细介绍UniApp开发中的即时通讯流程。本文将向您展示如何在UniApp中实现即时通讯功能&#xff0c;为您的应用程序增添交互性和实时性。 1. 准备工作 在开始开发之前&#xff0c;确保您已完成以下准备工作&#xff1a; 确保您已经安装好UniApp开发环境&#xff…

实现简单Spring基于XML的配置程序

定义一个容器&#xff0c;使用ConcurrentHashMap 做为单例对象的容器 先解析beans.xml得到第一个bean对象的信息&#xff0c;id&#xff0c;class&#xff0c;属性和属性值使用反射生成对象&#xff0c;并赋值将创建好的bean对象放入到singletonObjects集合中提供getBean(id)方…

【Nodejs】Node.js开发环境安装

1.版本介绍 在命令窗口中输入 node -v 可以查看版本 0.x 完全不技术 ES64.x 部分支持 ES6 特性5.x 部分支持ES6特性&#xff08;比4.x多些&#xff09;&#xff0c;属于过渡产品&#xff0c;现在来说应该没有什么理由去用这个了6.x 支持98%的 ES6 特性8.x 支持 ES6 特性 2.No…

下载python模块包

离线安装 在PyPI The Python Package Index 查找自己需要的安装包&#xff0c;直接下载对应操作系统的安装包即可 拿numpy举个例子&#xff0c;上面有好多类型的安装包&#xff0c;针对不同的操作系统&#xff0c;其中在文件名中可以看出有linus和macos等等&#xff0c;此外还…

论文笔记--Distilling the Knowledge in a Neural Network

论文笔记--Distilling the Knowledge in a Neural Network 1. 文章简介2. 文章概括3 文章重点技术3.1 Soft Target3.2 蒸馏Distillation 4. 文章亮点5. 原文传送门 1. 文章简介 标题&#xff1a;Distilling the Knowledge in a Neural Network作者&#xff1a;Hinton, Geoffre…

Macbook M1编译安装Java OpenCV

OpenCV-4.8.0编辑安装 查询编译依赖 brew info opencv确保所有需要模块都打上了✔&#xff0c;未打✔的需要使用brew进行安装 下载OpenCV源码 在此处下载OpenCV源代码&#xff0c;选择Source&#xff0c;点击此处下载opencv_contrib-4.8.0 或者使用如下命令&#xff0c;通…

gerrit 从安装到出坑

一般公司在做代码审核的时候选择codereview gerrit来处理代码的入库的问题。 它是通过提交的时候产生Change-Id: If4e0107f3bd7c5df9e2dc72ee4beb187b07151b9 来决定是不是入库&#xff0c;一般如果不是通过这个管理&#xff0c;那么就是我们通常的操作 git add . git comm…

【算法与数据结构】110、LeetCode平衡二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉树遍历一共有前中后遍历和层序遍历&#xff0c;这道题只有后序遍历适合&#xff0c;求深度是从上往…

【小黄碎碎念】如何解析和替换字符串中的 Markdown 文本?正则表达式与 flexmark-java 库

前言 本周&#xff0c;笔者将之前的基于 Servlet 的个人博客项目进行了迭代&#xff0c;基于 SpringBoot SpringMVC Mybatis Redis 进行实现。额外实现密码的明文加密处理&#xff08;加盐算法&#xff09;、修改博客、公共主页等功能&#xff0c;并将 session 存储到 Redis…

深度学习——批标准化Batch Normalization

什么是批标准化&#xff1f; 批标准化&#xff08;Batch Normalization&#xff09;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练过程并提高模型的收敛速度。 批标准化通过在神经网络的每一层中对输入数据进行标准化来实现。具体而言&#xff0c;对于每个输…

我在VScode学Python(Python函数,Python模块导入)

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 &#xff08;1&#xff09;关于Python基本语法学习---->可以参考我的这篇博客《我在VScode学Python》 &#xff08;2&#xff09;pip是必须的在我们学习python这门语言的过程中Python ----&#xff1e;&a…

fl studio 20如何设置中文汉化汇总及flstudio21水果language选项中文设置方法

fl studio这是一个编曲软件&#xff0c;它有中文和英文两种语言供大家选择&#xff0c;对我们来说&#xff0c;中文版肯定更方便。fl studio如何设置中文&#xff1f;事实上&#xff0c;只需在设置中切换中文即可。 我们一起 fl studio 20如何设置中文一些方法 一、fl studio手…

Angular:动态依赖注入和静态依赖注入

问题描述&#xff1a; 自己写的服务依赖注入到组件时候是直接在构造器内初始化的。 直到看见代码中某大哥写的 private injector: Injector 动态依赖注入和静态依赖注入 在 Angular 中&#xff0c;使用构造函数注入的方式将服务注入到组件中是一种静态依赖注入的方式。这种方…

docker中搭建lnmp

目录 一&#xff1a;项目环境 1、主机ip需求 2、 任务需求 二&#xff1a;多级构建Dockerfile实验部署 lnmp 1、先部署一个有所有依赖包的镜像 2、搭建nginx 3、搭建mysql 4、搭建php 三&#xff1a;一级构建安装lnmp 1、构建自定义docker网络 2、构建nginx容器&#x…

办公室安全升级,如何保障人身财产安全?

视频监控&#xff0c;一种常见的安全措施&#xff0c;以监视和记录办公室内的活动。这项技术为企业提供了许多优势&#xff0c;包括保障员工和财产安全、帮助调查犯罪事件、提高业务管理效率以及应对突发事件。 因此&#xff0c;在合理范围内应用视频监控&#xff0c;将为企业提…

LINUX中的myaql(一)安装

目录 前言 一、概述 二、数据库类型 三、数据库模型 四、MYSQL的安装 &#xff08;一&#xff09;yum安装MYSQL &#xff08;二&#xff09;rpm安装MYSQL 五、MYSQL本地登录 rpm安装MYSQL本地登录 六、重置密码 总结 前言 MySQL是一种常用的开源关系型数据库管理系统&#xff…

泛微OA客戶管理融合呼叫中心系统功能

泛微OA&#xff0c;全程数字化运营平台。用户因业务管理需要&#xff0c;crm客户管理流程中&#xff0c;需要通过语音与客户沟通&#xff0c;对话务沟通过程实现流程和过程化管理。 泛微OA中&#xff0c;无需过多编程代码。通过呼叫中心接口快速开发&#xff0c;实现点击拨打&…