Обзор проекта:на основеssmпроектблогсистематест
Стек технологий, связанных с проектом:SpringBoot
, SpringMVC
,MyBatis
, MySQL
, Redis
, HTML
, CSS
, JavaScript
Цель протокола испытаний:тестсобственныйблог Соответствует ли проект ожидаемым результатам?.
диапазон и дата:2023Год10луна
Общий статус выполнения теста:В основном для общих функцийтест Например:блог Страница входа,страница со списком блоговлапша,Страница сведений о блоге,Страница редактирования блога…
Предыстория проекта:Закрепите полученные знания об автоматизации.тест Сопутствующие знания. Тестовая цель:на основеServletосуществленныйблогсистема. Объяснение стратегии тестирования:Написано по логике обычного входа пользователя.тествариант использования и продолжитьтест. Объясните цель и суть теста.:Проверьте наличие недостатков и заполните пробелы..
аппаратное обеспечение:XiaoXinAir 14ALC 2021
программное обеспечение:Google Chrome
инструменты разработки:IDEA
инструменты тестирования:автоматизацияинструменты тестированияSelenium
Операционная система:Windows 10Семейная китайская версия
Версия браузера:Google Chrome 117.0.5938.134 (официальная версия) (64 Кусочек)
Страница входа в блог:
Страница регистрации в блоге:
Страница со списком личного блога:
Домашняя страница блога:
Страница сведений о блоге:
Страница редактирования блога:
(2) Номер счета правильный, а пароль неправильный. Ожидаемые результаты: всплывающее окно с сообщением о том, что вход в систему не удался, а имя пользователя или пароль были введены неправильно. Фактические результаты таковы:
(3) Номер счета верен, пароль пуст. Ожидаемые результаты: В окне будет предложено ввести пароль; Фактические результаты таковы:
(4) Номер счета и пароль верны. Ожидаемые результаты: Окно перейдет на страницу со списком личных блогов; Фактические результаты таковы:
2. Страница списка личных блогов: проверьте, соответствует ли интерфейс ожиданиям, можно ли нажать кнопку «Просмотреть полный текст» и перейти на соответствующую страницу сведений о блоге, а также можно ли выйти из системы, нажав кнопку «Выход». (1)Интерфейс
(2) Можно ли при нажатии кнопки «Просмотреть полный текст» перейти на соответствующую страницу сведений о блоге. Ожидаемые результаты: откройте соответствующую страницу сведений о блоге, и содержимое статьи можно будет загрузить правильно. Фактические результаты таковы:
(3) Можете ли вы выйти из системы, нажав «Выход»? Ожидаемые результаты: нажмите «Выйти», чтобы выйти и перейти на страницу списка блогов. Фактические результаты таковы:
(4) Нажмите, чтобы изменить Ожидаемые результаты: нажмите «Изменить» и перейдите на страницу редактирования статьи. Фактические результаты таковы:
(5) Нажмите «Удалить». Ожидаемый результат: статья будет удалена после нажатия кнопки «Удалить». Фактические результаты таковы:
Из-за итерации версий проекта, постепенного увеличения функций и необходимости проведения различных функциональных регрессионных тестов простое ручное тестирование уже не может соответствовать нашим требованиям к эффективности тестирования, поэтому мы ввели автоматизированное тестирование. Это может освободить людей от повторяющихся процессов механических испытаний, позволяя человеческим ресурсам инвестировать в более важные испытания.
(Содержит скриншотытест):AutotestUtils
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class AutotestUtils {
static WebDriver webDriver;
@BeforeAll
static void SetUp() {
webDriver = new ChromeDriver();
}
@AfterAll
static void TearDown() {
webDriver.quit();
}
//Получаем текущее время и сохраняем скриншот по времени
public List<String> getTime(){
//Папка сохраняется в днях
//Скриншот сохраняется с миллисекундной отметкой времени
SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");
SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");
String filename=sim1.format(System.currentTimeMillis());
String dirname=sim2.format(System.currentTimeMillis());
List<String> list = new ArrayList<>();
list.add(dirname);
list.add(filename);
return list;
}
//Получаем снимки экрана и сохраняем результаты выполнения всех вариантов использования
public void getScreenShot(String str) throws IOException {
List<String> list=getTime();
String filename="E:\\TestClass\\blog_ssm_test\\src\\main\\java\\com\\blogautotest"+list.get(0)+"\\"+str+"_"+list.get(1)+".png";
File srcfile=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
//Помещаем файл, сгенерированный скриншотом, по указанному пути
FileUtils.copyFile(srcfile,new File(filename));
}
}
Скриншот теста выглядит следующим образом:
LoginCases
:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class BlogCases extends AutotestUtils{
static String name;
/**
*
* Введите правильный номер счета и пароль для успешного входа в систему.
*/
@Order(1)
@ParameterizedTest
@CsvFileSource(resources = "LoginSuccess.csv")
void LoginSuccess(String username, String password, String blog_list_url) throws IOException {
System.out.println(username + password + blog_list_url);
// Откройте страницу входа в блог.
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Войти в аккаунт
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Введите пароль 12345
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Нажмите кнопку «Отправить»
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Перейти на страницу списка
// Получить URL текущей страницы
String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
getScreenShot(methodName);
String cur_url = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Если url=http://localhost:8080/myblog_list.html, тест пройден, в противном случае тест не пройден.
Assertions.assertEquals(blog_list_url, cur_url);
}
// Номер счета правильный, пароль неверный
@Order(2)
@ParameterizedTest
@CsvSource({"admin,123","zhangsan,666"})
void LoginAbnormal(String username,String password) throws InterruptedException {
webDriver.get("http://localhost:8080/login.html");
webDriver.findElement(By.cssSelector("#username")).clear();
webDriver.findElement(By.cssSelector("#password")).clear();
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.findElement(By.cssSelector("#submit")).click();
//Обработка всплывающих окон
Thread.sleep(300);
//Получаем содержимое всплывающего окна
String text=webDriver.switchTo().alert().getText();
String кроме="Вход успешен!";
webDriver.switchTo().alert().accept();
Assertions.assertNotEquals(except,text);
}
}
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;
public class RegCases extends AutotestUtils{
@Order(1)
@ParameterizedTest
@CsvSource({"zhangsan,12345,12345,http://localhost:8080/login.html"})
void regSuccess(String username,String password,String againpassword,String login_url) throws InterruptedException {
//Открываем домашнюю страницу
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//Находим кнопку регистрации и нажимаем ее
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//Вводим зарегистрированное имя пользователя и пароль
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.findElement(By.cssSelector("#password2")).sendKeys(againpassword);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
//Нажмите, чтобы отправить
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
}
/**
* Проверка страницы подробностей блога
* url
* Название блога
* Заголовок страницы: «Страница сведений о блоге».
*/
@Order(4)
@ParameterizedTest
@MethodSource("Generator")
void BlogDetail(String expected_url, String expected_title, String expected_blog_title) {
// Открыть страницу списка блогов
webDriver.get("http://localhost:8080/myblog_list.html");
// Найти полнотекстовую кнопку, соответствующую первой статье блога
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();
// Получить URL текущей страницы
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
String cur_url = webDriver.getCurrentUrl();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Получить текущий заголовок страницы
String cur_title = webDriver.getTitle();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Получить название блога
String cur_blog_title = webDriver.findElement(By.cssSelector("#title")).getText();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
Assertions.assertEquals(expected_title ,cur_title);
Assertions.assertEquals(expected_blog_title, cur_blog_title);
if(cur_url.contains(expected_url)) {
System.out.println("тест пройден");
} else {
System.out.println(cur_url);
System.out.println("тест не пройден");
}
}
//страница редактирования блога
@Order(5)
@Test
void EditBlog() throws InterruptedException {
// Открыть страницу списка блогов
webDriver.get("http://localhost:8080/myblog_list.html");
// Найдите кнопку написать блог и нажмите на нее.
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Ввод через Js
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"автоматизациятест\""); sleep(3000);
// Нажмите, чтобы опубликовать
webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
sleep(3000);
String cur_text = webDriver.switchTo().alert().getText();
String expect_text = «Поздравляем: добавление прошло успешно! Хотите продолжить добавление статей?»;
Assertions.assertEquals(expect_text,cur_text);
}
/**
* Проверка опубликована Название блога
* Проверка опубликованного времени
* страница со списком блогов
*/
@Order(6)
@Test
void BlogInfoChecked() {
webDriver.switchTo().alert().dismiss();
webDriver.get("http://localhost:8080/blog_list.html");
// Получить первую статью блога
String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();
// Узнайте время выхода первого блога
String first_blog_time = webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/div[2]")).getText();
// Проверить название блога Да или нетавтоматизациятест
Assertions.assertEquals("тест автоматизации", first_blog_title);
// Если время будет опубликовано 23 мая 2023 года, тест пройден.
if(first_blog_title.contains("2023-10")) {
System.out.println("тест пройден");
} else {
System.out.println("Текущее время:" + first_blog_time);
System.out.println("тест не пройден");
}
}
Удалить функцию:
/**
* Страница личного списка
* Удалить первую статью блога
*/
@Order(7)
@Test
void DeleteBlog() throws InterruptedException {
// Открыть персональную страницу со списком блоговлапша
webDriver.get("http://localhost:8080/myblog_list.html");
// Нажмите кнопку «Удалить»
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.switchTo().alert().accept();
}
//Выйти
@Order(8)
@Test
void Logout() {
webDriver.switchTo().alert().accept();
// Открыть персональную страницу со списком блоговлапша
//Нажмите Выйти webDriver.get("http://localhost:8080/myblog_list.html");
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
webDriver.switchTo().alert().accept();
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
// Подтвердить URL Выйдите из системы и войдите на страницу со списком блогов
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://localhost:8080/blog_list.html", cur_url);
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
}
Тест пройден. Страница сведений о блоге была проигнорирована, поскольку произошел конфликт (бизнес-логики) со страницей удаления блога. Это не повлияло на результаты теста.
В дополнение к приведенному выше описанию полный отчет об испытаниях также включает в себя следующие аспекты:
Мы не будем здесь слишком подробно останавливаться на этом, просто ознакомьтесь с ним уже после прихода в компанию. При этом при написании отчета о тестировании необходимо обратить внимание на следующие моменты: