在线OJ的自动化测试

在线OJ的自动化测试

项目介绍

该项目模拟实现了一个在线 OJ 系统,在线 OJ 可以让我们能够像在 LeetCode 或牛客网上一样写编程题。进入首页前需要注册登录,登录后进入首页,首页展示了题目列表,包括题号、题目名称和难度,通过点击题目进入代码编辑页面,该页面展示了题目的详细描述。用户提交代码后,后端根据用户提交的代码返回编译运行的结果。并支持管理员新增和删除题目

登录页面

在这里插入图片描述

注册页面

在这里插入图片描述

题目列表页

在这里插入图片描述

题目详情页

在这里插入图片描述

设计测试用例

在这里插入图片描述

页面登录校验

对于题目列表页和题目详情页需要用户登录才能访问,如果直接访问会跳出提示框,确认后跳转到登录页面

因此我们设计测试用例,让浏览器直接访问需要登录后才能访问的页面,确认提示框后,检验页面是否已经跳转到登录页面了

测试代码:

package com.ghaoi.oj_online.auto_test.web_test;

import com.ghaoi.oj_online.auto_test.common.CommonDriver;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class IsLoginedTest {
    private ChromeDriver driver = CommonDriver.getDriver();

    @Test
    void indexPage() throws InterruptedException {
        driver.get("http://localhost:8080/index.html");
        Thread.sleep(1000);
    }

    @Test
    void detailPage() throws InterruptedException {
        driver.get("http://localhost:8080/index.html");
        Thread.sleep(1000);
    }

    @AfterEach
    void checkLoginPage() {
        driver.switchTo().alert().accept();
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("登录", str);
    }
    
    @AfterAll
    static void close() {
        CommonDriver.getDriver().close();
    }
}

测试结果:

image-20220902145659448

登录页面测试

首先检测是否成功进入登录页面,以及页面的元素是否被正确展示

然后再根据测试用例输入用户名和密码进行登录测试

测试代码:

package com.ghaoi.oj_online.auto_test.web_test;

import com.ghaoi.oj_online.auto_test.common.CommonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class LoginCheckTest {
    private ChromeDriver driver = CommonDriver.getDriver();

    @BeforeEach
    void getUrl() {
        driver.get("http://localhost:8080/login.html");
    }

    @Test
    void loginPageCheck() {
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("登录", str);
    }

    // 什么都不输入,直接登录
    @Test
    void loginNothing() {
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 不输入用户名,输入密码
    @Test
    void loginNoName() {
        driver.findElement(By.cssSelector("#password")).sendKeys("admin");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入用户名,不输入密码
    @Test
    void loginNoPassword() {
        driver.findElement(By.cssSelector("#name")).sendKeys("admin");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入错误的用户名
    @Test
    void loginWrongName() {
        // 输入不存在的名字
        driver.findElement(By.cssSelector("#name")).sendKeys("123");
        // 输入密码
        driver.findElement(By.cssSelector("#password")).sendKeys("admin");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入正确的用户名,错误的密码
    @Test
    void loginWrongPassword() {
        // 输入正确的名字
        driver.findElement(By.cssSelector("#name")).sendKeys("admin");
        // 输入错误的密码
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入正确的用户名和密码
    @Test
    void loginRight() {
        // 使用管理员账户登录
        driver.findElement(By.cssSelector("#name")).sendKeys("admin");
        driver.findElement(By.cssSelector("#password")).sendKeys("admin");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        // 验证登录后的页面
        String str = driver.findElement(By.cssSelector("#gtco-who-we-are > div > div > div > h2")).getText();
        Assertions.assertEquals("题目列表", str);
    }
    
    // 测试能否从登录页面进入注册页面
    @Test
    void toRegister() {
        driver.findElement(By.cssSelector("#gtco-header-navbar > div > div > ul > li > a")).click();
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("注册", str);
    }
    
    @AfterAll
    static void close() {
        CommonDriver.getDriver().close();
    }
    
}

测试结果:

image-20220902160652323

注册页面测试

首先检测是否进入页面,以及页面的元素是否被正确展示

然后再根据测试用例输入用户名、密码和确认密码进行登录测试

测试代码:

package com.ghaoi.oj_online.auto_test.web_test;

import com.ghaoi.oj_online.auto_test.common.CommonDriver;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

public class RegisterTest {
    private ChromeDriver driver = CommonDriver.getDriver();

    @BeforeEach
    void getUrl() {
        // 直接进入注册页面
        driver.get("http://localhost:8080/register.html");
    }

    // 校验页面元素
    @Test
    void checkPageElement() {
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("注册", str);
        str = driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row " +
                "> div > div > div.col-md-12.form-btn.text-center > button")).getText();
        Assertions.assertEquals("Register", str);
    }

    // 什么都不输入直接点击注册按钮
    @Test
    void RegisterNothing() {
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 只输入用户名后点击注册按钮
    @Test
    void RegisterNoPassword() {
        driver.findElement(By.cssSelector("#name")).sendKeys("test");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 只输入密码和确认密码后点击注册按钮
    @Test
    void RegisterNoName() {
        driver.findElement(By.cssSelector("#password")).sendKeys("test");
        driver.findElement(By.cssSelector("#passwordConfirm")).sendKeys("test");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 只输入用户名和密码不输入确认密码后点击注册按钮
    @Test
    void RegisterNoConfirm() {
        driver.findElement(By.cssSelector("#name")).sendKeys("test");
        driver.findElement(By.cssSelector("#password")).sendKeys("test");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入存在的用户名和密码后点击注册按钮
    @Test
    void RegisterExists() {
        // 该用户名事先已注册
        driver.findElement(By.cssSelector("#name")).sendKeys("Harley");
        driver.findElement(By.cssSelector("#password")).sendKeys("harley");
        driver.findElement(By.cssSelector("#passwordConfirm")).sendKeys("harley");
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        driver.switchTo().alert().accept();
    }

    // 输入还未注册的用户名和密码后点击注册按钮
    @Test
    void RegisterRight() {
        // 使用当前时间戳作为用户名和密码进行测试,确保测试的用户名一定不存在
        String name = String.valueOf(System.currentTimeMillis());
        // 输入用户名和密码后点击注册按钮
        driver.findElement(By.cssSelector("#name")).sendKeys(name);
        driver.findElement(By.cssSelector("#password")).sendKeys(name);
        driver.findElement(By.cssSelector("#passwordConfirm")).sendKeys(name);
        driver.findElement(By.cssSelector("#gtco-contact-form > div > div > div.row > " +
                "div > div > div.col-md-12.form-btn.text-center > button")).click();
        // 校验注册成功后是否进入题目列表页
        String str = driver.findElement(By.cssSelector("#gtco-who-we-are > div > div > div > h2")).getText();
        Assertions.assertEquals("题目列表", str);
    }

    // 检验能否从注册页面进入登录页面
    @Test
    void toLogin() {
        driver.findElement(By.cssSelector("#gtco-header-navbar > div > div > ul > li > a")).click();
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("登录", str);
    }
    
    @AfterAll
    static void close() {
        CommonDriver.getDriver().close();
    }

}

测试结果:

image-20220902164039782

题目列表页测试

该页面需要测试页面元素、点击题目是否跳转以及导航栏中各按钮的功能

该测试中存在“注销”功能,因此为了保证其他测试能够正常进行,需要让测试按照固定顺序执行,确保“注销”测试放在最后

package com.ghaoi.oj_online.auto_test.web_test;

import com.ghaoi.oj_online.auto_test.common.CommonDriver;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ProblemListTest {
    private ChromeDriver driver = CommonDriver.getDriver();

    @BeforeAll
    // 先登录才能进入题目列表页
    static void login() {
        ChromeDriver driver1 = CommonDriver.getDriver();
        driver1.get("http://localhost:8080/login.html");
        driver1.findElement(By.cssSelector("#name")).sendKeys("admin");
        driver1.findElement(By.cssSelector("#password")).sendKeys("admin");
        driver1.findElement(By.cssSelector("#gtco-contact-form > div > div > " +
                "div.row > div > div > div.col-md-12.form-btn.text-center > button")).click();
    }

    @BeforeEach
    void getUrl() {
        driver.get("http://localhost:8080/index.html");
    }

    // 检测页面元素
    @Test
    @Order(1)
    void checkPageElement() {
        String str = driver.findElement(By.cssSelector("#gtco-who-we-are > div > div > div > h2")).getText();
        Assertions.assertEquals("题目列表", str);
    }

    // 点击题目看能否跳转到题目详情页面
    @Test
    @Order(2)
    void toDetail() {
        driver.findElement(By.cssSelector("#problemTbody > tr:nth-child(2) > td:nth-child(2) > a")).click();
        String str = driver.findElement(By.cssSelector("#gtco-single-content > div >" +
                " div > div > div > h5:nth-child(1)")).getText();
        Assertions.assertEquals("代码编辑区", str);
        str = driver.findElement(By.cssSelector("#gtco-single-content > div > " +
                "div > div > div > h5:nth-child(6)")).getText();
        Assertions.assertEquals("运行结果", str);
    }

    // 点击导航栏的Manage检查能否进入管理员页面
    @Test
    @Order(3)
    void toManage() {
        driver.findElement(By.cssSelector("#gtco-header-navbar > div > div > ul > li:nth-child(2) > a")).click();
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("题目管理", str);
    }

    // 点击导航栏的Logout检查是否退出登录
    @Test
    @Order(4)
    void Logout() {
        driver.findElement(By.cssSelector("#gtco-header-navbar > div > div > ul > li:nth-child(3) > a")).click();
        driver.switchTo().alert().accept();
        String str = driver.findElement(By.cssSelector("body > div > div > div > h1")).getText();
        Assertions.assertEquals("登录", str);
    }
    
    @AfterAll
    static void close() {
        CommonDriver.getDriver().close();
    }

}

测试结果:

image-20220902180653806

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值