自动化测试Junit

1.什么是Junit

        

JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。
JUnit 促进了“先测试后编码”TDD的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点.......”,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。
 

2.Junit注解

这些是Junit的部分注解

        

  那我们Junit有哪些常用的注解呢

                1.@Test

这一个注解作用于方法上面,表示这个方法是一个测试用例。当@Test注解作用在一个方法上面的时候,表示这一个方法是可以直接运行的,无需通过main方法来调用。放在哪就运行哪个类

                2.@BeforeAll

首先,被@BeforeAll注释的方法一定是静态的,BeforeAll在@Test修饰的方法之前运行,@BeforeAll注释的方法一定是静态的,并且只会在加载外部类的时候执行一次,并不会在每一个方法执行之前再次执行了

3.@AfterAll

被这个注解修饰的方法也必须是静态的,在@Test修饰的方法之后进行运行

4.@BeforeEach

在执行每一个被@Test修饰的方法之前,都会执行一次@BeforeEach注释的方法。

代码如下

import org.junit.jupiter.api.*;

public class JunitTest {
    @Test
    void test01(){
        System.out.println("===========这是一个测试用例============");
    }
    @Test
    void test02(){
        System.out.println("===========这是一个测试用例============");
    }

    @BeforeAll
    static  void  start(){
        System.out.println("开始测试");
    }

    @AfterAll
    static void  End(){
        System.out.println("结束测试");
    }
    @BeforeEach
    void startV1(){
        System.out.println("开始一条测试用例");
    }
    @AfterEach
      void EndV1(){
        System.out.println("结束一条测试用例");
    }

}

       

结果

5.@AfterEach

在执行每一个被@Test修饰的方法之后,都会执行一次@AfterEach注释的方法。

6.测试用例顺序指定

          我们想要指定执行的顺序,我们就需要用一个注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

并在测试用例中加上Order()然后就可以指定执行顺序

 

2.注解的参数化

                1.单参数

                        

@ParameterizedTest
    @ValueSource(ints={1,2,3,4,5})
    void Test03(int x ){
        System.out.println("接受的参数是x="+x);
    }

单参数有局限性,只能接受一种类型的参数,对应的Test03()只能接受一个参数

                2.多参数

                        

 @ParameterizedTest
    @CsvSource({"'王五',20"})
    void Test04(String name ,int age){
        System.out.println(name+"今年"+age+"岁");
    }

如图所知,这种方法可以执行多参数

我们的多参数文件还可以读取文件中的数据进行操作

@ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void test05(String name,int age){
        System.out.println("name="+name+",age="+age);
    }

                3.通过方法生成参数

        

@ParameterizedTest
    @MethodSource("Generate")
    void Test6(String name,int age){
        System.out.println("name:"+name+"age:"+age);
    }




public static Stream<Arguments> Generate() {
        return Stream.of(
                Arguments.arguments("张三",13),
                Arguments.arguments("李四",10));
    }

        

3.测试套件

1.通过class去运行测试用例

        

//通过class去运行测试用例
@Suite
@SelectClasses({JunitTest.class,JunitTest1.class})
public class RunTests {

}

2.通过package去运行测试用例

@Suite
@SelectPackages(value = {"example"})
public class RunTests {

}

4.断言

        断言主要是判断

断言(assert):也就是所谓的assertion,是jdk1.4后加入的新功能

官话: 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ——摘自百度百科【断言】

行话: 断言(Assertion)是一种调试程序的方式,断言可以在调试情况当错误排查,用于检查前条件,是我们的代码更加接近"契约式编程"


大白话:就是为了检测我们程序自己疏忽写出来的bug啦,当断言报错我就知道这里是我写错了

1.断言相等的表达式

表示当相等时才会成立,,不相等时会报错

2.断言不相等的表达式

              表示当不相等时才会成立,相等时不通过

3.断言为空

                表达式为空能通过,不为空不通过

4.断言不为空

      表达式为空能不通过,不为空通过

        

                       

5.自动化项目--博客系统

        1.我们先要搭建好环境,拥有博客系统这个项目,详细看我的博客系统

2.编写出测试用例

                

3.我们根据测试用例写出自动化测试代码

        1.登录的测试用例

public class Tests extends  InitAndEndBrowser {

    //登录测试用例
   @ParameterizedTest
   @CsvSource({"'http://49.233.1.44:9090/blog_login.html','zhangsan','http://49.233.1.44:9090/blog_list.html'"})
    void login(String url,String username,String ex_url ) throws InterruptedException {
        webDriver.get(url);
        sleep(5000);
        //输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        //输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
        //提交
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);
        //找登录成功后的校验是否登录成功
        String Username=webDriver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText();
            if(Username.equals(username)){
            System.out.println("测试通过");

        }else {
            System.out.println("测试不通过");
        }

        String cur_url=webDriver.getCurrentUrl();
        if(cur_url.equals(ex_url)){
            System.out.println("测试通过");

        }else {
            System.out.println("测试不通过");
        }

    }

           2.博客列表的

@Test
    void LoginError() throws InterruptedException {
        String  username="zhangsan";
        String password="1234567";
        webDriver.get("http://49.233.1.44:9090/blog_login.html");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.findElement(By.cssSelector("#submit")).click();
        String exurl=webDriver.getCurrentUrl();
//        if(exurl.equals("http://49.233.1.44:9090/blog_login.html")){
//           System.out.println("测试通过");
//       }else {
//            System.out.println("测试不通过");
//        }
       Assertions.assertEquals("http://49.233.1.44:9090/blog_login.html",exurl);


    }

3.发布博客

                

@Test
    void PublishBlog() throws InterruptedException {
        //打开博客列表页
        webDriver.get("http://49.233.1.44:9090/blog_list.html");
        // 点击写博客的按钮
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        sleep(3000);
        //document.querySelector("#title").value="测试"
        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#title\").value=\"测试\"");
                sleep(2000);
        //输入对应的标题(通过selenium执行js脚本来完成)
        webDriver.findElement(By.cssSelector("#submit"));
        //校验
        //1,找到发布博客对应的标题
        WebElement title=webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > " +
                "div" +
                ".title"));
        sleep(2000);
        //2.校验标题对应的元素是否为空,如果不为空,说明测试通过,如果为空,测试不通过
        Assertions.assertNotNull(title);

    }

4.删除博客

        

@Order(3)
     @Test
     void DeleteBlog() throws InterruptedException {
       webDriver.get("http://49.233.1.44:9090/blog_list.html");
       webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();
       sleep(2000);
       webDriver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > " +
               "button:nth-child(2)")).click();
      sleep(2000);
      String url=webDriver.getCurrentUrl();
      Assertions.assertEquals("http://49.233.1.44:9090/blog_list.html",url);
     }

5.退出博客

        

   @Order(4)
    @Test
    void QuitBlog() throws InterruptedException {
        webDriver.get("http://49.233.1.44:9090/blog_list.html");
        sleep(2000);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        String url=webDriver.getCurrentUrl();
        sleep(3000);
        String name=webDriver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(2) > " +
                "span")).getText();
        Assertions.assertEquals("http://49.233.1.44:9090/blog_login.html",url);
        Assertions.assertEquals("用户名",name);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt QProcess详解

1.简介 QProcess提供了在 Qt 应用程序中启动外部程序的方法。通过QProcess&#xff0c;你可以启动一个进程&#xff0c;与它通信&#xff08;发送输入和读取输出&#xff09;&#xff0c;检查它的状态&#xff0c;以及等待它完成。这个类在执行系统命令、运行其他程序或脚本时…

Leetcode 394. 字符串解码

心路历程&#xff1a; 这道题看到括号直接想到栈&#xff0c;五分钟新题直接秒了&#xff0c;一开始以为需要两个栈分别存储数字和非数字&#xff0c;后来发现一个栈就够了&#xff0c;思路如图&#xff1a; 这道题考察的应该是队栈这两种数据结构的转换&#xff0c;因为每次…

LangChain - 文档加载

文章目录 一、关于 检索二、文档加载器入门指南 三、CSV1、使用每个文档一行的 CSV 数据加载 CSVLoader2、自定义 csv 解析和加载 &#xff08;csv_args3、指定用于 标识文档来源的 列&#xff08;source_column 四、文件目录 file_directory1、加载文件目录数据&#xff08;Di…

缺少vcruntime140_1.dll

windows安装mysql的时候错误提示&#xff1a; 64位下载安装&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1u_ALo0JMc-Y2an22l1Y1EA 提取码&#xff1a;ve10 32位下载安装&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/16XTt642Tj-Oc-WvbgQK-Ww 提取码…

学校4-11天梯赛选拔赛

目录 L1-5 6翻了 题目 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路 AC代码 L1-1 嫑废话上代码 题目 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; AC代码 L1-8 刮刮彩…

MySQL_00001_00000

数据准备 员工表&#xff1a;emp Oracle: create table emp ( empno number(4) not null, ename varchar2(10), job varchar2(9), mgr number(4), hiredate date, sal number(7, 2), comm number(7, 2), deptno number(2) ); insert into em…

bugku-web-decrypt

这里的提示解密后没有什么意义 这里下载文件包 得到一个index.php文件 得到代码 <?php function encrypt($data,$key) {$key md5(ISCC);$x 0;$len strlen($data);$klen strlen($key);for ($i0; $i < $len; $i) { if ($x $klen){$x 0;}$char . $key[$x];$x1;}for…

计算机炸了,电子信息也是劝退专业?

还不是因为这个版本&#xff0c;计算机专业受到了制裁&#xff0c;导致这些偏计算机类的专业也受到了牵连 我本科的时候是一所双一流院校的计科专业&#xff0c;我们学校的电子信息专业堪称苦逼&#xff0c;我们计科学的东西&#xff0c;他们都要学&#xff0c;他们学的一些东…

什么是享元模式,有哪些具体应用

一、定义 享元模式是一种通过尽可能多地共享数据来最小化内存使用和对象数量&#xff0c;从而提高性能的设计模式。在享元模式中&#xff0c;如果需要相同数据的多个对象&#xff0c;则共享这些对象而不是创建新的对象&#xff0c;从而提高系统的效率。 其实有很多应用场景&am…

基于顺序表实现通讯录

上篇我们讲了顺序表是什么&#xff0c;和如何实现顺序表。这篇文章我们将基于顺序表来实现通讯录。 文章目录 前言一、基于顺序表是如何实现的二、通讯录的头文件和实现文件三、通讯录的实现3.1 定义通讯录结构3.2 初始化通讯录3.3 销毁通讯录3.4 通讯录添加数据3.5 查找联系人…

golang 使用栈模拟计算器

思路&#xff1a; // Author sunwenbo // 2024/4/12 16:51 package mainimport ("errors""fmt""strconv" )// 使用数组来模拟一个栈的应用 type Stack struct {MaxTop int //表示栈最大可以存放数的个数Top int //表示栈底&#xff…

【QT入门】Qt自定义控件与样式设计之自定义QLineEdit实现搜索编辑框

往期回顾 【QT入门】Qt自定义控件与样式设计之qss的加载方式-CSDN博客 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件-CSDN博客 【QT入门】Qt自定义控件与样式设计之鼠标相对、绝对位置、窗口位置、控件位置-CSDN博客 【QT入门】Qt自定义控件与样式设计之自定义QLin…

蓝桥杯之注意事项

1.特殊求解的地方 2.一些数学公式 比如二叉树求全深度数值那道题 3.掌握有关库函数 #include<algorithm> 包含sort&#xff08;&#xff09;函数【排列函数】C sort()排序详解-CSDN博客&#xff0c;next_permutation()函数【求解全排列问题】求解数组大小sizeof(arr…

2024年腾讯云最新优惠活动及领券入口整理分享

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人选择将业务部署在云端。腾讯云作为国内知名的云计算服务提供商&#xff0c;为用户提供了丰富的云产品和服务。为了帮助用户降低成本&#xff0c;腾讯云定期推出各种优惠活动。本文将为大家整理分享2024年腾讯云的最新…

亲测能用MathType7破解版本安装包百度网盘下载

MathType 7是一款专业的数学公式编辑工具&#xff0c;广泛应用于教育教学、科研机构、工程学、物理学、化学等多个领域。它支持各种数学符号、公式、方程式、矩阵、分数、上下标等&#xff0c;几乎涵盖了所有的数学元素&#xff0c;可以帮助用户快速、方便地创建高质量的数学公…

【Cesium学习笔记】二、隐藏控件及按钮

【Cesium学习笔记】二、隐藏控件及按钮 一、隐藏控件二、隐藏cesium图标 Ps:本教程所有代码于同一个工程中&#xff0c;运行npm run dev默认首页为App.vue&#xff0c;只需替换App.vue的内容即可切换不同页面。 将上一节的App.vue保存为类似“加载cesium.vue”这种对应名称。 …

如何在Photoshop中,使用本地Stable Diffusion WebUI的绘图能力

&#x1f3c3;‍♂️文章背景 相信设计师朋友们最熟悉的软件应该就是photoshop了&#xff0c;现在AI绘图虽然控制性越来越强&#xff0c;但跟ps比起来&#xff0c;还是要弱很多&#xff0c;尤其是图层、蒙版、笔刷、色调校色等等功能&#xff0c;所以就算是使用SD或者midjourn…

虚拟机下CentOS7开启SSH连接

虚拟机下CentOS7开启SSH连接 自己在VMware中装了CentOS 6.3&#xff0c;然后主机&#xff08;或者说xshell&#xff09;与里面的虚拟机连不通&#xff0c;刚学习&#xff0c;一头雾水&#xff0c;查了半天&#xff0c;也不知道怎么弄。 在虚拟机&#xff08;Vmware Workstatio…

2024蓝桥A组A题

艺术与篮球&#xff08;蓝桥&#xff09; 问题描述格式输入格式输出评测用例规模与约定解析参考程序难度等级 问题描述 格式输入 无 格式输出 一个整数 评测用例规模与约定 无 解析 模拟就好从20000101-20240413每一天计算笔画数是否大于50然后天数&#xff1b; 记得判断平…

Linux 网络排查命令

端口相关服务检查 netstat -ntpl|grep [$Port]说明&#xff1a;[$Port]为相应的端口号。 0.0.0.0代表本机上可用的任意地址。比如&#xff0c;0.0.0.0:80表示本机上所有地址的80端口。 tcp 0.0.0.0:80表示在所有的可用接口上监听TCP的80端口 如果返回结果为空&#xff0c;说明…