【针对项目在线OJ系统的测试】:Junit+Selenium

这篇具有很好参考价值的文章主要介绍了【针对项目在线OJ系统的测试】:Junit+Selenium。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、背景介绍:

二、导入的依赖:

三、测试模块1:index页面的测试

测试点1:测试"我的OJ系统这4个字是否存在"

测试点2:测试"题目列表"这4个字是否存在

测试点3:测试"编号","标题","难度"三者是否存在

测试点4:测试题目列表的元素

测试步骤1:明确需要哪些参数(从左到右)

测试步骤2:在一个指定的文件当中,分别放入上述的内容

测试步骤3:编写测试用例代码

四、测试模块:题目详情页和代码编辑的测试

步骤1:明确需要的测试参数

步骤2:新建一个文件,保存两道题目的测试用例,以逗号隔开

步骤3:编写测试用例代码

步骤4:分别针对两道题目进行用户输入代码的测试

针对题目1进行测试:

测试代码1:测试编译错误是否可以检查出来

测试代码2:测试运行异常

测试代码3:测试代码运行超时情况

测试代码4:正确输入的情况

测试代码5:测试用户输入中文注释的情况

第一步:查看后台接收请求的方式(编码集):

 第二步:查看编译生成的文件夹

 第三步:查看编译命令

解决问题

再次验证bug

​编辑


一、背景介绍:

在这一篇文章当中,我们已经实现了一个简易的OJ平台;

【项目篇1】一个在线OJ系统_革凡成圣211的博客-CSDN博客回顾一下我们常见的OJ平台,例如:leetcode,牛客等等,他们都有哪些功能?https://blog.csdn.net/weixin_56738054/article/details/130072129?spm=1001.2014.3001.5502下面,我们来介绍一下,怎样针对这一个平台进行测试。


二、导入的依赖:

       导入的依赖主要是selenium框架的jar包+junit5的jar包,项目的主要测试步骤就是通过运行junit进行排查。

<dependency>
               <groupId>commons-io</groupId>
               <artifactId>commons-io</artifactId>
               <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

三、测试模块1:index页面的测试

index页面就是一个用户查询题目列表的页面,当用户输入了URL之后,就可以查询这一个页面了

这个页面如下:

【针对项目在线OJ系统的测试】:Junit+Selenium

 新建一个测试类:IndexTest,并且定位到指定的页面,并且截图,上传到指定的文件夹;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class IndexTest extends CommonDriver{

    /**
     * 获取到这一个driver实例
     */
    private static final FirefoxDriver driver= getDriver();

    @BeforeAll
    public static void getPage() throws InterruptedException, IOException {
        driver.get("http://localhost:8080/OJSystem_war_exploded");
        //需要对于首页进行截图
        //以文件的形式存储
        File srcFile=driver.getScreenshotAs(OutputType.FILE);
        //把截图的文件存放到指定的目录下面
        File destFile=new File("E:/OJSystem/src/test/Files/index.png");
        Thread.sleep(1000);
        FileUtils.copyFile(srcFile,destFile);
        //设置隐式等待时间:最长3秒
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
    }
}

测试点1:测试"我的OJ系统这4个字是否存在"

 /**
     * 测试:"我的OJ系统"这个标题是否存在
     */
    @Test
    @Order(1)
    public void checkTittle(){
        WebElement webElement =driver.findElement(By.cssSelector("body > nav > a"));
        String text=webElement.getText();
        //断言:二者是否一致
        Assertions.assertEquals("我的 OJ 系统",text);
    }

 【针对项目在线OJ系统的测试】:Junit+Selenium

 测试结果:通过


测试点2:测试"题目列表"这4个字是否存在

 /**
     * 测试:"题目列表" 是否存在
     */
    @Test
    @Order(2)
    public void checkProblemListIfExits(){
        WebElement element=driver.findElement(By.cssSelector("#tables > div > div > h3"));
        String test= element.getText();
        Assertions.assertEquals("题目列表",test);
    }

【针对项目在线OJ系统的测试】:Junit+Selenium

 测试结果:通过


测试点3:测试"编号","标题","难度"三者是否存在

/**
     * 测试:编号、标题、难度三者是否存在
     */
    @Test
    @Order(3)
    public void checkProblemListTittles(){
        //测试:"编号"是否存在
        WebElement element1=driver.findElement(By.cssSelector("#tables > div > div > table > thead > tr > th:nth-child(1)"));
        String number=element1.getText();
        Assertions.assertEquals("编号",number);
        //测试:"标题"是否存在
        WebElement element2=driver.findElement(By.cssSelector("#tables > div > div > table > thead > tr > th:nth-child(2)"));
        String tittle=element2.getText();
        Assertions.assertEquals("标题",tittle);
        //测试:"难度"是否存在
        WebElement element3=driver.findElement(By.cssSelector("#tables > div > div > table > thead > tr > th:nth-child(3)"));
        String hard=element3.getText();
        Assertions.assertEquals("难度",hard);
    }

【针对项目在线OJ系统的测试】:Junit+Selenium

测试结果:通过


测试点4:测试题目列表的元素

测试目的:验证题目列表当中的内容是否正确;

例如验证第一题的序号是不是"1",链接是不是"两数之和",难度是否为"简单"

考虑到测试的题目是一系列的题目,因此可以采用参数化的方式模拟参数传入。


测试步骤1:明确需要哪些参数(从左到右)

参数1:题目编号的CSS选择器;

参数2:题目编号的预期;

参数3:题目链接"两数之和"的链接的CSS选择器;

参数4:题目链接"两数之和"的文本;

参数5:题目难度的CSS选择器;

参数6:题目难度的文本;


测试步骤2:在一个指定的文件当中,分别放入上述的内容

在指定目录下面,新建一个.csv文件,并且配置这两个题目的参数


#题目1的测试参数

problemTable > tr:nth-child(1) > td:nth-child(1),1,problemTable > tr:nth-child(1) > td:nth-child(2) > a,两数之和,problemTable > tr:nth-child(1) > td:nth-child(3),简单


#题目2的测试参数

problemTable > tr:nth-child(2) > td:nth-child(1),3,problemTable > tr:nth-child(2) > td:nth-child(2) > a,搜索插入位置,problemTable > tr:nth-child(2) > td:nth-child(3),简单

测试步骤3:编写测试用例代码

分别抓取上述题目列表里面的三个元素的CSS选择器,进行测试,或者点击题目链接,进行截图。

/**
     * 在csc文件当中:#是注释,不可以直接拼接
     * 测试index页面的题目
     * 题目链接的css选择器@param cssSelector
     * 预计的标题@param tittleExcept
     * 预计的编号@param number
     * 预计的难度@param hard
     */
    @ParameterizedTest
    @Order(4)
    @CsvFileSource(files = "E:\\OJSystem\\src\\main\\resources\\ProjectTest.csv")
    public void checkClickTittle(
                                 String numberCss,String numberExcept,
                                 String tittleLinkedCss,String tittleExcept,
                                 String difficultCss,String difficultExcept) throws InterruptedException, IOException {
        {
            //校验题目列表编号是否正确
            WebElement numberElem = driver.findElement(By.cssSelector("#"+numberCss));
            String realNumber = numberElem.getText();
            //比较列表和实际的是否一致
            Assertions.assertEquals(numberExcept, realNumber);
        }
        {
            //获取到题目链接的css选择器
            WebElement TittleLinkElement = driver.findElement(By.cssSelector("#"+tittleLinkedCss));
            //获取题目链接的实际内容
            String tittleReal = TittleLinkElement.getText();
            Assertions.assertEquals(tittleExcept, tittleReal);
            //点击,看一下跳转的结果:
            TittleLinkElement.click();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //截图:看是否成功跳转
            File srcFile=driver.getScreenshotAs(OutputType.FILE);
            //把截图的文件存放到指定的目录下面
            File destFile=new File("E:/OJSystem/src/test/Files/ProblemLinked"+numberExcept+".png");
            Thread.sleep(1000);
            FileUtils.copyFile(srcFile,destFile);
        }
        {
            //题目难度的CSS选择器
            WebElement difficulties = driver.findElement(By.cssSelector("#"+difficultCss));
            String realTittle=difficulties.getText();
            //难度的比较
            Assertions.assertEquals(difficultExcept,realTittle);
        }
    }

测试结果:通过 


四、测试模块:题目详情页和代码编辑的测试

【针对项目在线OJ系统的测试】:Junit+Selenium

步骤1:明确需要的测试参数

参数1:题目的编号(主键Id);

参数2:标题:例如"两数之和"的CSS选择器;

参数3:标题的内容:例如"两数之和";

参数4:题目细节的CSS选择器(例如上图当中的题目细节就是描述)

参数5:代码编辑框的CSS选择器


步骤2:新建一个文件,保存两道题目的测试用例,以逗号隔开

#测试第一题:两数之和
1,problemDesc > h3,1.两数之和_简单,problemDesc > pre > p,editor > div.ace_scroller > div

#测试第二题:搜索插入位置
3,problemDesc > h3,3.搜索插入位置_简单,problemDesc > pre > p,editor > div.ace_scroller > div

步骤3:编写测试用例代码

由于真实的题目长度和代码编辑框当中的代码呈现比较长,因此就不使用断言测试了,改为:观察+控制台输出的方式。

 /**
     *
     * 针对某一题设计的测试
     * 测试详情页的元素是存在
     * 标题的CSS选择器@param tittleCss
     * 题目的描述的CSS选择器@param detailsCss
     * 模板代码的CSS选择器@param templateCodeCss
     */
    @ParameterizedTest
    @CsvFileSource(files = "E:\\OJSystem\\src\\main\\resources\\ProblemDetails.csv")
    public void testDescribe(String tittleId,
                             String tittleCss,String tittleContentExcept,
                             String detailsCss,
                             String codeEditCss){
        //锁定题目的标题
        driver.get("http://localhost:8080/OJSystem_war_exploded/problemDetail.html?id="+tittleId);
        //设置最长等待时间
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        //测试标题是否符合预期
        {
            WebElement tittleCssReal = driver.findElement(By.cssSelector("#"+tittleCss));
            String realContent = tittleCssReal.getText();
            //测试题目的标题和预期是否一致
            Assertions.assertEquals(tittleContentExcept,realContent);
        }
        //测试题目的描述是否和预期一样
        {
            WebElement descCssReal=driver.findElement(By.cssSelector("#"+detailsCss));
            String realDetails=descCssReal.getText();
            System.out.println("真实的题目"+realDetails);
        }
        //测试模板代码
        {
            WebElement codeEditElem=driver.findElement(By.cssSelector("#"+codeEditCss));
            //获取到模板代码的测试框
            String codeText=codeEditElem.getText();
            System.out.println("测试框的代码:"+codeText);
        }
    }

步骤4:分别针对两道题目进行用户输入代码的测试

在这里就不再使用自动化脚本进行测试了,因为用户输入代码的场景比较复杂,不适宜使用自动化测试,改为手工测试;

针对题目1进行测试:

测试代码1:测试编译错误是否可以检查出来

【针对项目在线OJ系统的测试】:Junit+Selenium

测试结果:

【针对项目在线OJ系统的测试】:Junit+Selenium 测试情况:通过


测试代码2:测试运行异常

测试代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] nums1=new int[3];
        nums1[3]=0;
        return nums1;
    }
}

测试结果:

【针对项目在线OJ系统的测试】:Junit+Selenium

测试结果:通过 


测试代码3:测试代码运行超时情况

测试代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        
        int i=0;
        while(i<=100){
            System.out.println(i++);
            i--;
        }
        return nums;
    }
}

测试情况:通过 

【针对项目在线OJ系统的测试】:Junit+Selenium


测试代码4:正确输入的情况

【针对项目在线OJ系统的测试】:Junit+Selenium

测试情况:通过测试。


测试代码5:测试用户输入中文注释的情况

【针对项目在线OJ系统的测试】:Junit+Selenium


这是一个BUG!!

排除步骤:

第一步:查看后台接收请求的方式(编码集):

发现是utf8编码集,并且控制台也正常的输出了用户提交的题目:

【针对项目在线OJ系统的测试】:Junit+Selenium

 【针对项目在线OJ系统的测试】:Junit+Selenium


 第二步:查看编译生成的文件夹

【针对项目在线OJ系统的测试】:Junit+Selenium

【针对项目在线OJ系统的测试】:Junit+Selenium


 第三步:查看编译命令

此处我采用的命令是:javac -encoding utf8 %s -d %s,采用的是utf8的编码集进行编译的。

【针对项目在线OJ系统的测试】:Junit+Selenium

切换到cmd命令行,再次使用这个命令编译一下:

【针对项目在线OJ系统的测试】:Junit+Selenium

        bug原因分析:windows系统默认的编码集是gbk,因此需要采用gbk的编码集来进行编译(但是,如果把项目部署到Linux系统,就不用gbk了,就需要采用utf8编码集。


解决问题

把编译的命令改成: javac -encoding gbk %s -d %s


再次验证bug

bug已解决。文章来源地址https://www.toymoban.com/news/detail-415542.html

【针对项目在线OJ系统的测试】:Junit+Selenium

到了这里,关于【针对项目在线OJ系统的测试】:Junit+Selenium的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 华为OD机试(2023A+B)真题目录 + 考点分类 + 在线OJ模拟

    本专栏内所有博客均有两项内容组成: 题目描述、输入描述、输出描述、用例、备注 题目解析、算法源码 其中: 第1项内容均收集自互联网,专栏博客付费内容不包含此项(第1项),如若此项(第1项)内容侵犯了原著者的合法权益,可联系我:(CSDN网站注册用户名:伏城

    2024年02月08日
    浏览(35)
  • 华为OD机试(A卷+B卷+C卷)真题目录 + 在线OJ入口 + 通过率

    本专栏内所有博客均有两项内容组成: 题目描述、输入描述、输出描述、用例、备注 题目解析、算法源码 其中: 第1项内容均收集自互联网,专栏博客付费内容不包含此项(第1项),如若此项(第1项)内容侵犯了原著者的合法权益,可联系我:(CSDN网站注册用户名:伏城

    2024年02月03日
    浏览(33)
  • 项目——负载均衡在线OJ

    这个项目是设计一个在线均衡的在线刷题网站,具有登录,注册,判题,用户通过题的状态,录题的功能。 对功能实现的说明: 对于登录的实现:作者设计了一个session用于保存用户登录信息。当用户登录时服务器会创建一个会话并且返回一个sessionId给用户。后续的判题功能

    2024年02月15日
    浏览(35)
  • C++项目:【负载均衡式在线OJ】

    文章目录 一、项目介绍 二、技术栈与开发环境 1.所用技术: 2.开发环境: 三、项目演示 1.运行代码 2.进入项目首页 3.题目列表 4.点击具体一道题 5.编辑代码并提交 四、项目思维导图 五、项目宏观结构 六、Comm公共模块 1.日志工具log.hpp 2.其他工具util.hpp 七、CompilerServer模块

    2024年02月08日
    浏览(30)
  • 基于负载均衡的在线OJ实战项目

    该篇讲述了实现基于负载均衡式的在线oj,即类似在线编程做题网站一样,文章尽可能详细讲述细节即实现,便于大家了解学习。 文章将采用单篇不分段形式(ps:切着麻烦),附图文,附代码,代码部署在云服务器上 C++ STL标准库 Boost 标准库 cpp-httpib 开源库 ctemplate 第三方开

    2024年02月10日
    浏览(31)
  • Selenium+JUnit的自动化测试报告

    文章摘要:         本文记录了作者本人的交流论坛项目的自动化测试报告具体内容。其中其中包括了对项目测试用例的设计、测试工具的选择、测试环境的准备部署和项目测试的代码设计。较为完整的展现了自动化测试的全过程。           在测试之前,首先要做的工作

    2024年02月04日
    浏览(32)
  • C++实战演练---负载均衡在线oj项目预热

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》 键盘敲烂,年薪百万!         学习准备了快一年时间,心心念念的实战演练终于可以开始了,话不多说,直接进入主题!!!        该项目是基于负载均衡的在线OJ平台,用户可

    2024年04月28日
    浏览(18)
  • MSOLSpray:一款针对微软在线账号(AzureO365)的密码喷射与安全测试工具

    MSOLSpray是一款针对微软在线账号(Azure/O365)的密码喷射与安全测试工具,在该工具的帮助下,广大研究人员可以直接对目标账户执行安全检测。支持检测的内容包括目标账号凭证是否有效、账号是否启用了MFA、租户账号是否存在、用户账号是否存在、账号是否被锁定或账号是

    2024年04月12日
    浏览(36)
  • Java在线OJ项目(三)、前后端交互API模块

    前端:通过problem的URL地址访问(如果没有其它参数,则是查询所有题目,如果有id参数,就是查询具体题目) 后端:返回题目的具体详情 前端 获取所有题目 获取一个题目 后端 前端提交代码 后端处理

    2024年02月14日
    浏览(36)
  • 软件测试自动化Java篇【Selenium+Junit 5】

    为什么选择selenium作为我们的web自动化测试工具? 开源免费 支持多浏览器 支持多系统 支持多语言【Java,Python,C#,Rubby,JavaScript,Kolin】 selenium包提供了很多可供测试使用的API Chrome浏览器 Chrome驱动【驱动器版本要和浏览器版本对应越详细越好】 然后把驱动包放在安装jdk的

    2024年01月18日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包