[Тестирование программного обеспечения] Отчет о тестировании проекта системы блога (проект ssm)
[Тестирование программного обеспечения] Отчет о тестировании проекта системы блога (проект ssm)

1. Краткое содержание отчета

Обзор проекта:на основеssmпроектблогсистематест Стек технологий, связанных с проектомSpringBoot, SpringMVC ,MyBatis, MySQL, Redis, HTML, CSS, JavaScript Цель протокола испытаний:тестсобственныйблог Соответствует ли проект ожидаемым результатам?. диапазон и дата:2023Год10луна Общий статус выполнения теста:В основном для общих функцийтест Например:блог Страница входа,страница со списком блоговлапша,Страница сведений о блоге,Страница редактирования блога…

2. Введение

Предыстория проекта:Закрепите полученные знания об автоматизации.тест Сопутствующие знания. Тестовая цель:на основеServletосуществленныйблогсистема. Объяснение стратегии тестирования:Написано по логике обычного входа пользователя.тествариант использования и продолжитьтест. Объясните цель и суть теста.:Проверьте наличие недостатков и заполните пробелы..

3. Тестовая среда

аппаратное обеспечение:XiaoXinAir 14ALC 2021 программное обеспечение:Google Chrome инструменты разработки:IDEA инструменты тестирования:автоматизацияинструменты тестированияSelenium Операционная система:Windows 10Семейная китайская версия Версия браузера:Google Chrome 117.0.5938.134 (официальная версия) (64 Кусочек)

4. Обзор выполнения теста и функциональное тестирование.

1. Ручное тестирование

Страница входа в блог:

Страница регистрации в блоге:

Страница со списком личного блога:

Домашняя страница блога:

Страница сведений о блоге:

Страница редактирования блога:

1.1 Написание тестовых примеров
1.2 Выполните несколько тестовых случаев
  1. Страница входа в блог: Может ли интерфейс нормально загружаться? Можно ли получить ожидаемый ответ, введя правильный или неправильный номер учетной записи и пароль? (1) Можно ли нормально загрузить интерфейс

(2) Номер счета правильный, а пароль неправильный. Ожидаемые результаты: всплывающее окно с сообщением о том, что вход в систему не удался, а имя пользователя или пароль были введены неправильно. Фактические результаты таковы:

(3) Номер счета верен, пароль пуст. Ожидаемые результаты: В окне будет предложено ввести пароль; Фактические результаты таковы:

(4) Номер счета и пароль верны. Ожидаемые результаты: Окно перейдет на страницу со списком личных блогов; Фактические результаты таковы:

2. Страница списка личных блогов: проверьте, соответствует ли интерфейс ожиданиям, можно ли нажать кнопку «Просмотреть полный текст» и перейти на соответствующую страницу сведений о блоге, а также можно ли выйти из системы, нажав кнопку «Выход». (1)Интерфейс

(2) Можно ли при нажатии кнопки «Просмотреть полный текст» перейти на соответствующую страницу сведений о блоге. Ожидаемые результаты: откройте соответствующую страницу сведений о блоге, и содержимое статьи можно будет загрузить правильно. Фактические результаты таковы:

(3) Можете ли вы выйти из системы, нажав «Выход»? Ожидаемые результаты: нажмите «Выйти», чтобы выйти и перейти на страницу списка блогов. Фактические результаты таковы:

(4) Нажмите, чтобы изменить Ожидаемые результаты: нажмите «Изменить» и перейдите на страницу редактирования статьи. Фактические результаты таковы:

(5) Нажмите «Удалить». Ожидаемый результат: статья будет удалена после нажатия кнопки «Удалить». Фактические результаты таковы:

2. Автоматизированное тестирование Selenium

Из-за итерации версий проекта, постепенного увеличения функций и необходимости проведения различных функциональных регрессионных тестов простое ручное тестирование уже не может соответствовать нашим требованиям к эффективности тестирования, поэтому мы ввели автоматизированное тестирование. Это может освободить людей от повторяющихся процессов механических испытаний, позволяя человеческим ресурсам инвестировать в более важные испытания.

2.1 Написание тестовых примеров
2.2 Автоматизированный тестовый код
1. Инструменты автоматизированного тестирования

(Содержит скриншотытест):AutotestUtils

Язык кода:javascript
копировать
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));
    }
}

Скриншот теста выглядит следующим образом:

2. Тест страницы входа в блог

LoginCases:

Язык кода:javascript
копировать
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);
    }
}
3. Страница регистрации в блоге.
Язык кода:javascript
копировать
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);
    }
}
4. Страница сведений о блоге
Язык кода:javascript
копировать
    /**
     * Проверка страницы подробностей блога
     * 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("тест не пройден");
        }
    }
5. Страница редактирования блога
Язык кода:javascript
копировать
    //страница редактирования блога
    @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);
    }
6. Страница со списком блогов
Язык кода:javascript
копировать
    /**
     * Проверка опубликована Название блога
     * Проверка опубликованного времени
     * страница со списком блогов
     */
    @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("тест не пройден");
        }
    }
7. Страница личного списка

Удалить функцию:

Язык кода:javascript
копировать
    /**
     * Страница личного списка
     * Удалить первую статью блога
     */
    @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();
    }
8. Выход из системы
Язык кода:javascript
копировать
    //Выйти
    @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);
    }

3. Результаты испытаний

Тест пройден. Страница сведений о блоге была проигнорирована, поскольку произошел конфликт (бизнес-логики) со страницей удаления блога. Это не повлияло на результаты теста.

4. Основные особенности тестового проекта

  1. Использование инструментов автоматизации тестированияи рамки,Написание автоматизированных тестовых сценариев,Повышение эффективности и стабильности тестирования. Автоматизация может охватывать тестирование пользовательского интерфейса, сокращая человеческий вклад,И может выполнять непрерывную интеграцию и непрерывную доставку.
  2. Используйте параметризацию, чтобы сохранить чистоту вариантов использования и улучшить читаемость кода.
  3. Использование неявного ожидания повышает эффективность автоматизации и повышает ее стабильность.
  4. Используйте снимки экрана, чтобы облегчить отслеживание и решение проблем.

5. Другие

В дополнение к приведенному выше описанию полный отчет об испытаниях также включает в себя следующие аспекты:

  1. Производительность: если есть тест производительности,Записывайте результаты испытаний и анализируйте их.,включатьтестнагрузка、время ответа、Пропускная способность и другие показатели.
  2. Безопасный тест: если существует безопасный тест,Запись результатов испытаний,В том числе обнаруженные уязвимости безопасности, оценка рисков и т. д.
  3. Управление дефектами:перечислен втеств процессе Обнаружены дефекты,Укажите номер дефекта, описание, серьезность, приоритет и т. д.,И указать статус и решение дефекта.
  4. Краткое содержание теста: подведите итоги и оцените результаты тестового теста.,Включая тестовое покрытие, оценку качества, оценку рисков и т. д.,Предложения для программного обеспечения Комплексная оценка качества обеспечения.
  5. Предложения и улучшения: на основе процесса и результатов тестирования группа тестирования вносит предложения и улучшения проекта или процесса.
  6. Вложение: Предоставьте тестовый сценарий.、бревно、Скриншоты и другие связанные вложения,Чтобы читатели могли лучше понять процесс и результаты.

Мы не будем здесь слишком подробно останавливаться на этом, просто ознакомьтесь с ним уже после прихода в компанию. При этом при написании отчета о тестировании необходимо обратить внимание на следующие моменты:

  1. Отчеты должны быть ясными, краткими, простыми для понимания и использования. Следует избегать, насколько это возможно, чрезмерного технического жаргона и сложных формулировок.
  2. Отчеты должны точно отражать процесс и результаты.,включатьтест Статус выполнения варианта использования、Обнаружены дефекты、Данные теста и информация об окружающей среде.
  3. Комплексный анализ и оценка результатов тестирования, дающий представление о программном обеспечении. Комплексная оценка качества обеспечения.
  4. Ведите подробные записи об управлении и устранении дефектов и регулярно обновляйте список дефектов, чтобы разработчики могли своевременно устранять проблемы.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose