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

Posted 小何学长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件测试报告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 作业总结

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

以上是关于软件测试报告Selenium+TestNG综合练习的主要内容,如果未能解决你的问题,请参考以下文章

Java&Selenium&TestNG&ZTestReport 自动化测试并生成HTML自动化测试报告

TestNG 电子邮件报告 - PKIX 路径构建异常

TestNG 搭建测试框架 自动化测试

使用 selenium TestNG 和 selenium 进行并行测试

Selenium2(java)TestNG的使用 七

自动化测试框架selenium+java+TestNG——配置篇