一、测试需求
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。
一个用户想要登入进后台管理系统,需要满足以下条件:
输入条件 | 有效等价类编号 | 有效等价类 | 无效等价类编号 | 无效等价类 |
---|
是否填写用户名 | (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 作业总结
通过这次实验,对软件测试有了更进一步的学习了解,在测试过程之中也不断的有问题出现,通过上网搜索来解决问题,自我感觉也提升了不少,也希望自己以后也可以更加的完善。
|