【软件测试报告】Selenium+TestNG综合练习
作者:互联网
学号:04191315
姓名:何翔
学院:计算机学院
专业:软件工程
转载或引用请标注本文链接:https://www.cnblogs.com/He-Xiang-best/p/15719087.html
完整代码:https://github.com/He-Xiang-best/Software-Quality-Assurance-and-Testing
一、测试需求
1.1 测试模块
登入功能模块
1.2 测试内容
-
使用【Selenium+Java+数据库】进行数据驱动测试,对自己搭建的Web项目做登入功能测试
-
使用【Selenium+Java+Excel】进行数据驱动测试,对自己搭建的Web项目做登入功能测试
-
使用【Junit】对自己开发的web程序进行单元测试,实现简单的增删查改操作
1.3 测试用例
字段名称 | 描 述 |
---|---|
标识符 | UC1 |
测试项 | 登入功能 |
设计者 | 何翔 |
测试环境要求 | 与服务器可以正常连接 ;软件:Chrome浏览器96版本以上 ,jdk1.8+,maven相关依赖以及TestNG相关包 |
测试方法 | 手工测试 ;黑盒测试 ;白盒测试 |
输入说明 | (1) 点击登入链接(2)填写登入信息,其中所填写的“用户名”、“密码”登入信息需要和注册保存在数据库信息里面的数据一致,且非空 (3) 点击登入按钮 |
输出标准 | 界面提示信息: (2)登入成功(2)当输入信息不符合要求时要有具体提示(3)登入失败的话,显示登入失败具体失败的原因。 ,跳转相关页面 |
特殊要求 | 进入到后台登入页面 |
用例之间的依赖性 | 无 |
二、测试设计思想
2.1 Selenium+Java+数据库 and Excel
2.2 Junit单元测试
三、测试代码(核心部分)
3.1 Selenium+Java+数据库
@Test(dataProvider="getDatabaseData")
public void webTestByUseDatabase(String username , String password){
openChrome(url);
chromeDriver.findElement(By.name("username")).sendKeys(username);
chromeDriver.findElement(By.name("password")).sendKeys(password);
chromeDriver.findElement(By.xpath("//input[@type='submit']")).click();
assertEquals(FileRoot.getUsername(), username);
assertEquals(FileRoot.getPassword(), password);
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
chromeDriver.quit();
}
@DataProvider(name = "getDatabaseData")
public Object[][] getDatabaseData() throws ClassNotFoundException, SQLException {
//读取数据库文件信息
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection(FileRoot.getUrl(),FileRoot.getSqlUserName(),
FileRoot.getSqlPassword());
Statement s = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = s.executeQuery("select * from user ");
int total = 0;
while (rs.next()) {
total++;
}
Object[][] data = new Object[total][2];
rs.beforeFirst();
int a = 0;
while (rs.next()) {
data[a][0] = rs.getString("user_name");
data[a][1] = rs.getString("user_pwd");
a++;
}
return data;
}
3.2 Selenium+Java+Excel
@Test(dataProvider="getExcelData")
public void webTestByUseExcel(String username , String password){
openChrome(url);
chromeDriver.findElement(By.name("username")).sendKeys(username);
chromeDriver.findElement(By.name("password")).sendKeys(password);
chromeDriver.findElement(By.xpath("//input[@type='submit']")).click();
assertEquals(FileRoot.getUsername(), username);
assertEquals(FileRoot.getPassword(), password);
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
chromeDriver.quit();
}
@DataProvider(name = "getExcelData")
public Object[][] getExcelData(){
//读取Excel文件数据
List<Map<Integer, String>> list = EasyExcel
.read(FileRoot.getExcelPath())
.sheet()
.doReadSync();
Object[][] data = new Object[list.size()][];
int row=0, column;
for (Map<Integer, String> map : list) {
data[row] = new Object[map.size()];
column=0;
for (String value : map.values()) {
data[row][column] = value;
column++;
}
row++;
}
return data;
}
3.3 Junit单元测试
package com.study;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.study.springboot.entity.User;
import com.study.springboot.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.util.List;
@SpringBootTest
class SpringbootApplicationTests {
/*
* @author: 何翔
* @date: 2021/10/6 0:56
* @description:security 安全访问测试
*/
@Test
public void contextLords(){
PasswordEncoder pe = new BCryptPasswordEncoder();
String encode = pe.encode("123");
System.out.println(encode);
boolean matches = pe.matches("123",encode);
System.out.println(matches);
}
/*
* @author: 何翔
* @date: 2021/10/6 0:55
* @description:mybatis-plus 数据库测试
*/
@Autowired
UserService userService;
@Test
public void query() {
//System.out.println(userService.getById(10));
System.out.println(userService.list(null));
}
@Test
void insert() {
User user = new User();
user.setUserName("李四");
user.setUserPwd("456");
System.out.println(userService.save(user));
System.out.println(user.getUserId());
}
@Test
void delete() {
System.out.println(userService.removeById(11));
}
@Test
void update() {
System.out.println(userService.update(new UpdateWrapper<User>().lambda()
.set(User::getUserPwd, "223").eq(User::getUserId, 11)));
}
@Test
void page() {
IPage<User> iPage = new Page<>(1,2);
IPage<User> page = userService.page(iPage);
List<User> records = page.getRecords();
System.out.println(records);
System.out.println(page.getPages());
}
}
四、测试数据
五、数据分析
5.1 测试运行分析
用户名为空的情况 | 密码为空的情况 | 用户名和密码都为空的情况 |
用户名和密码均填写 | 用户名或密码错误 | 用户名和密码均正确 |
测试项目运行如下:
5.2 测试情况类别
测试情况 | 输入数据 | 期望值 | 实际值 |
---|---|---|---|
case1 | 输入错误用户名,输入正确密码 | 进入404页面 | 进入404页面 |
case2 | 输入正确用户名,输入错误密码 | 进入404页面 | 进入404页面 |
case3 | 输入错误用户名,输入错误密码 | 进入404页面 | 进入404页面 |
case4 | 不输入用户名,输入正确密码 | 在用户名栏提示“请填写此字段” | 在用户名栏提示“请填写此字段” |
case5 | 输入正确用户名,不输入密码 | 在密码栏提示“请填写此字段” | 在密码栏提示“请填写此字段” |
case6 | 不输入用户名,不输入密码 | 在用户名栏提示“请填写此字段” | 在用户名栏提示“请填写此字段” |
case7 | 输入错误用户名,不输入密码 | 在密码栏提示“请填写此字段” | 在密码栏提示“请填写此字段” |
case8 | 不输入用户名,输入错误密码 | 在用户名栏提示“请填写此字段” | 在用户名栏提示“请填写此字段” |
case9 | 输入正确用户名,输入正确密码 | 登入成功,进入后台主页 | 登入成功,进入后台主页 |
5.3 测试数据报告
使用TestNG生成测试报告如下:
5.4 测试数据详情
六、测试总结
6.1 问题分析
本次针对自己搭建的Web项目进行测试,大体效果上没有什么问题,但是在测试过程中,也遇到了诸多问题,如下分析:
问题1:
问题1分析:
此处使用了Mybatis-plus框架,并用框架提供的相关方法查询数据库,但是无法将数据查出,报空指针异常,而且框起来那部分代码是没问题的,能在junit单元测试上测试成功,不知道使用了框架后,TestNG是否支持,如果支持是否有哪些地方进行改进。在测试中遇到了此问题,上网查几乎没有相关解答。
随后考虑报错原因:
1、因为测试工程是springboot工程,使用TestNG过程中未解决依赖注入等问题,可能在使用时有其他要求或代码添加等问题需要改进。
于是我不用自动依赖装配注入等,直接使用new对象调用方法,结果还是不行,依旧报同样的错误
涉及这方面的知识,后续再了解一下,是否真的存在相关问题。(问题2同样也有)
2、使用TestNG时,与Mybatis-plus框架支持有其他使用要求或代码添加等问题需要改进。于是我不适用MyBatis-plus框架,通过原生jdbc的方式,封装在外面的方法里,进行调用查询,可是,同样报一样的错误,不能查询到数据,上网查了一下,也遇到有相关问题:
此问题目前也没有明确问题关键问题与解答,而提供的解决方式就是——将连接操作数据库的代码都直接放在 @DataProvider 中,它就可以正常工作,所以改后就是上面代码给出的那部分。
问题2:
在断言地址时,同样由于工程自动装配依赖注入等问题,无法完成断言。
和问题1第一个问题类似,涉及这方面的知识,后续再了解一下,是否真的存在相关问题,并如何解决。因此在测试时取消了此断言的方案。
除了测试学习过程中遇到的一些问题,测试项目本身也有待完善的地方,但期末安排紧张,就之后有空再稍作改进。
6.2 待完善点
因为测试的项目使用了springsecurity安全框架,因此在密码和用户名都填了登入失败时,会由安全框架控制跳转。因此在测试时,前后端并未使用异步交互,如ajax那种,可以查询出确切的登入失败信息,如用户不存在,用户存在但登入密码错误两种情况,目前项目中就由安全框架控制直接跳转404页面,这部分后续有时间再修改完善一下。
6.3 作业总结
通过这次实验,对软件测试有了更进一步的学习了解,在测试中遇到的问题,能够自己寻找解决方案解决,从中也能学习到更多的知识,也能够将学习到的知识运用到实践当中,自己可以自觉学习相关专业知识,相信后续自己也会不断完善相关方面的知识学习,把知识应用的更好。
标签:用户名,登入,Selenium,TestNG,密码,测试,import,输入,软件测试 来源: https://www.cnblogs.com/He-Xiang-best/p/15719087.html