在线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();
}
}
测试结果:
登录页面测试
首先检测是否成功进入登录页面,以及页面的元素是否被正确展示
然后再根据测试用例输入用户名和密码进行登录测试
测试代码:
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();
}
}
测试结果:
注册页面测试
首先检测是否进入页面,以及页面的元素是否被正确展示
然后再根据测试用例输入用户名、密码和确认密码进行登录测试
测试代码:
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();
}
}
测试结果:
题目列表页测试
该页面需要测试页面元素、点击题目是否跳转以及导航栏中各按钮的功能
该测试中存在“注销”功能,因此为了保证其他测试能够正常进行,需要让测试按照固定顺序执行,确保“注销”测试放在最后
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();
}
}
测试结果: