IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 软件测试:Selenium+TestNG -> 正文阅读

[开发测试]软件测试:Selenium+TestNG

一、测试需求

1.1 测试模块

登入功能模块
系统用户输入相对应的账号密码登录系统,只有在账号和密码都存在,并且密码输入正确的时候才能登录成功。
产品 模块 子模块 功能 测试点 优先级
学生管理系统 登录模块 学生登录模块 学生登录 账号密码的一致性 高

产品模块子模块功能测试点优先级
学生管理系统登录模块学生登录模块学生登录账号密码的一致性

1.2 测试内容

使用【Selenium+Java+数据库】进行数据驱动测试,对自己搭建的Web项目做登入功能测试

二、测试设计思想

2.1 测试用例

字段名称描述
标识符UC1
测试项登入功能
设计者亮仔
测试环境要求与服务器可以正常连接 ;软件:FireFox浏览器95.0.2 ,jdk1.8+,maven相关依赖以及TestNG相关jar包
测试方法黑盒测试
输入说明(1) 进入登录界面(2)填写登入信息,其中所填写的“用户名”、“密码”两个输入框不能为空,且登入的用户信息需要和注册保存在数据库里面的数据一致(3)点击登入按钮
输出标准界面提示信息:(1)登入成功时有提示,并能够跳转成功的相关页面(2)当输入的信息不符合要求时,要有具体提示(3)登入失败的时,显示登入失败具体失败的具体原因
特殊要求进入到后台登入页面
用例之间的依赖性

2.2 等价类划分

我们可以设用户输入的登入用户名为:u_num,输入的登入密码为:p_word;正确对应存在的登入用户名为:username,正确对应存在的登入密码为:password。

一个用户想要登入进后台管理系统,需要满足以下条件:

  • 登入用户名输入框已填写数据:

    u_num ≠ 空

  • 登入密码输入框已填写数据:

    p_word ≠ 空

  • 如果表单信息都填写了,还要判断填写的用户名存在:

    u_num = username

  • 如果用户名存在,还要判断填写的密码与存在用户的密码一致:

    p_word = password

输入条件有效等价类编号有效等价类无效等价类编号无效等价类
是否填写用户名(1)u_num ≠ 空(2)u_num = 空
是否填写密码(3)p_word ≠ 空(4)p_word = 空
是否存在用户(5)u_num= username(6)u_num≠ username
是否密码一致(7)p_word = password(8)p_word ≠ password
序号输入值 (u_num/p_word)覆盖等价类编号输出
1(“”,XXX)(2),(3),(6),(8)请输入用户名
2(“”,"")(2),(4),(6),(8)请输入用户名
3(“”,password)(2),(3),(6),(7)请输入用户名
4(XXX,“ ”)(1),(4),(6),(8)请输入密码
5(username,“ ”)(1),(4),(5),(8)请输入密码
6(XXX,XXX)(1),(3),(6),(8)用户不存在
7(XXX,password)(1),(3),(6),(7)用户不存在
8(username,XXX)(1),(3),(5),(8)密码输入错误
9(username,password)(1),(3),(5),(7)登入成功

三、测试数据

数据库数据

在这里插入图片描述

测试用例编号输入数据预期值
Case1u_num=1;p_word=123登录成功
Case2u_num=1;p_word=456密码错误
Case3u_num=1;p_word=””密码错误
Case4u_num=””;p_word=123用户不存在
Case5u_num=””;p_word=456用户不存在
Case6u_num=””;p_word=””用户不存在
Case7u_num=789;p_word=123用户不存在
Case8u_num=789;p_word=456用户不存在
Case9u_num=789;p_word=””用户不存在

四、测试代码(核心部分)

在这里插入图片描述

TestDatabase.java

package com.homework;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.openqa.selenium.firefox.FirefoxDriver;

import javax.swing.*;
import java.nio.file.Path;
import java.nio.file.attribute.UserDefinedFileAttributeView;
import java.sql.*;
import java.util.List;

import static org.testng.Assert.assertEquals;

//鼠标操作
public class TestDatabase {
    public WebDriver webDriver;
    String Ori_url="http://localhost:8080/StuAMSystem/login/login.jsp";
    String Succ_url="http://localhost:8080/StuAMSystem/ServletLogin";


    @BeforeClass
    public void setUpEnv() {
        System.setProperty("webdriver.gecko.driver", "src/driver/geckodriver.exe");
        //打开火狐浏览器
        webDriver = new FirefoxDriver();

    }

    @Test(dataProvider =  "getDatabaseData")
    public void testDatabase(String u_num,String p_word,String result) throws InterruptedException {
        webDriver.get("http://localhost:8080/StuAMSystem/login/login.jsp");
        //将鼠标移动到学生按钮上点击
        Actions actions = new Actions(webDriver);
        WebElement employee = webDriver.findElement(By.xpath("//*[@id=\"_body\"]/form/table/tbody/tr[3]/td/input[1]"));

        //移动到元素上
        actions.moveToElement(employee).click();
        Thread.sleep(1000);
        //选中账号框
        WebElement username = webDriver.findElement(By.xpath("//*[@id=\"_body\"]/form/table/tbody/tr[1]/td/input"));
        actions.moveToElement(username).click().sendKeys(u_num);
        Thread.sleep(1000);
        //选中密码框输入密码
        WebElement password = webDriver.findElement(By.xpath("//*[@id=\"_body\"]/form/table/tbody/tr[2]/td/input"));
        actions.moveToElement(password).click().sendKeys(p_word);
        Thread.sleep(1000);
        //选中登录按钮点击
        WebElement sub = webDriver.findElement(By.xpath("//*[@id=\"_body\"]/form/table/tbody/tr[4]/td/input[1]"));
        actions.moveToElement(sub).click();
        //登录成功
        if(webDriver.getTitle().equals("学生界面")){
            assertEquals("登录成功",result);
        }
        //账号为空,密码不为空
        if(webDriver.getCurrentUrl()==Succ_url&&username==null&&password!=null){
            assertEquals("账号不存在",result);
        }
        //账号不为空,密码为空
        if(webDriver.getCurrentUrl()==Succ_url&&username!=null&&password==null){
            assertEquals("密码错误",result);
        }
        //账号密码都为空
        if(webDriver.getCurrentUrl()==Succ_url&&username==null&&password==null){
            assertEquals("账号不存在",result);
        }
        Thread.sleep(3000);

    }

    @AfterClass
    public void tearDownEnv() throws InterruptedException {
        Thread.sleep(3000);
        webDriver.quit();
    }


    @DataProvider(name = "getDatabaseData")
    public Object[][] getDatabaseData() throws ClassNotFoundException, SQLException {
        //读取数据库文件信息
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql:///sam_student?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username = "ckl";
        String password = "ckl60236612";

        Connection con = DriverManager.getConnection(url, username, password);
        java.sql.Statement stmt = con.createStatement();

        ResultSet rs = stmt.executeQuery("select * from user_test ");

        int total = 0;
        while (rs.next()) {
            total++;
        }
        Object[][] data = new Object[total][3];
        rs.beforeFirst();
        int a = 0;
        while (rs.next()) {
            data[a][0] = rs.getString("user_num");
            data[a][1] = rs.getString("password");
            data[a][2] = rs.getString("result");
            a++;
        }

        return data;


    }
}

五、数据分析

5.1 测试运行分析

  • Case:1
    在这里插入图片描述

  • Case:2
    在这里插入图片描述

  • Case:3
    在这里插入图片描述

  • Case:4,5
    在这里插入图片描述

  • Case:6
    在这里插入图片描述

  • Case:7,8,9
    在这里插入图片描述

登入成功后跳转到相应的后台页面:
在这里插入图片描述

测试项目的运行如下:
在这里插入图片描述

所有测试全都正确通过

六、测试总结

6.1 技术亮点

6.1.1 使用springboot框架搭建项目

使用springboot框架能够快速搭建项目,对主流的开发框架都提供了?配置集成(springboot内置了配置),且项?可以独?运?、?需单独配置servlet容器(内置了tomcat),极?提?了开发、部署效率,此外还提供了运?时监控系统(?志等)。
在这里插入图片描述

6.1.2 使用springsecurity安全框架

SpringSecurity 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案,能帮助我们更好地实现登入功能的认证和授权。
项目中的使用(部分示例):
在这里插入图片描述

6.2 问题分析

运行时不会有错,但是会出现这么一段话:
Error: Channel closing: too late to send/recv, messages will be lost

在这里插入图片描述
之前是想在IDEA上下载可以生成testNG的报告插件,所以修改了pom.xml里的文件内容,但是就会出现这个错误。
但是将pom.xml里的文件内容还原回去之后,这个错误还是存在,上网搜索发现火狐浏览器就是存在这一问题,但是在最一开始时是不会有这个问题的,着实有点让人不理解


修改前:
在这里插入图片描述
搜索到的火狐浏览器存在的问题:
在这里插入图片描述

6.3 作业总结

通过这次实验,对软件测试有了更进一步的学习了解,在测试过程之中也不断的有问题出现,通过上网搜索来解决问题,自我感觉也提升了不少,也希望自己以后也可以更加的完善。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:23:15  更:2022-01-16 13:23:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 4:41:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码