【软件测试报告】Selenium+TestNG综合练习

【软件测试报告】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 作业总结

通过这次实验,对软件测试有了更进一步的学习了解,在测试中遇到的问题,能够自己寻找解决方案解决,从中也能学习到更多的知识,也能够将学习到的知识运用到实践当中,自己可以自觉学习相关专业知识,相信后续自己也会不断完善相关方面的知识学习,把知识应用的更好。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>