软件测试: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) 登入成功

三、测试数据

数据库数据

在这里插入图片描述

测试用例编号 输入数据 预期值
Case1 u_num=1;p_word=123 登录成功
Case2 u_num=1;p_word=456 密码错误
Case3 u_num=1;p_word=”” 密码错误
Case4 u_num=””;p_word=123 用户不存在
Case5 u_num=””;p_word=456 用户不存在
Case6 u_num=””;p_word=”” 用户不存在
Case7 u_num=789;p_word=123 用户不存在
Case8 u_num=789;p_word=456 用户不存在
Case9 u_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 作业总结

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

猜你喜欢

转载自blog.csdn.net/m0_59081425/article/details/122508806