Статичне та динамічне тестування: основні відмінності та практичні приклади

Що таке статичне тестування

Статичне тестування – це процес аналізу програмного коду, документації та інших артефактів розробки без виконання коду. Метою статичного тестування є виявлення помилок на ранніх стадіях розробки, що дозволяє зекономити час і ресурси.

Статичне тестування може включати ревізію коду, перевірку стилю коду, тестування вимог до системи та інші методи, які дозволяють перевірити якість коду та документів без виконання програми.

Що таке динамічне тестування

Динамічне тестування – це процес перевірки програмного забезпечення шляхом його виконання. Метою динамічного тестування є виявлення помилок у робочому програмному забезпеченні та перевірка його функціональності.

Динамічне тестування може включати різні методи, такі як модульне тестування, інтеграційне тестування, системне тестування та приймальне тестування. Зазвичай динамічне тестування використовується після статичного тестування, коли програмний код вже було перевірено на наявність очевидних помилок.

Яка різниця: порівнюємо статичне та динамічне тестування

Основна відмінність між статичним та динамічним тестуванням полягає в тому, що статичне тестування проводиться без виконання коду, тоді як динамічне тестування передбачає виконання програми.

Статичне тестування дозволяє виявити помилки на ранніх стадіях розробки, що сприяє економії часу та ресурсів. Динамічне тестування, навпаки, фокусується на перевірці функціональності програми та виявленні помилок в робочому ПЗ.

Кожен з методів має свої переваги та недоліки. Статичне тестування дозволяє виявити помилки раніше, але не гарантує їх повного виявлення. Динамічне тестування допомагає перевірити реальну роботу програми, але може бути трудомістким і витратним. Оптимальним рішенням є поєднання обох методів тестування.

Тестування вимог до системи: важлива частина статичного тестування

Тестування вимог до системи є важливим аспектом статичного тестування, оскільки воно допомагає переконатися, що вимоги до системи є чіткими, зрозумілими та правильно сформульованими. На цьому етапі проводиться аналіз вимог та перевірка на предмет можливих протиріч, недосконалостей та неоднозначностей.

Це може включати перегляд вимог, їх форматування та структуру, а також співпрацю з командою розробників для виправлення будь-яких помилок.

Методи статичного тестування: від ревізії коду до статичного аналізу

  1. Ревізія коду – процес перегляду програмного коду іншими розробниками або спеціалістами з тестування з метою виявлення помилок, порушень стилю коду та інших проблем.
  2. Перевірка стилю коду – процес аналізу коду на відповідність певним стандартам стилю коду, що дозволяє забезпечити кращу читабельність та супроводжуваність коду.
  3. Статичний аналіз коду – автоматична перевірка коду спеціальними інструментами, що допомагають виявити помилки, уразливості та порушення рекомендацій щодо якості коду.

Інструменти для статичного тестування: забезпечуємо якість коду

ESLint

ESLint – це інструмент статичного аналізу коду, який допомагає виявити потенційні проблеми та недоліки в коді JavaScript. Він використовує набір правил для аналізу та перевірки стилю коду, а також можливих помилок.

Приклад використання ESLint:

  • Встановлення ESLint: Перш ніж розпочати роботу з ESLint, потрібно встановити його за допомогою npm (Node.js package manager):

npm install eslint --save-dev
  • Конфігурація ESLint: Для налаштування правил ESLint у проекті створіть файл .eslintrc.json та визначте потрібні правила. Наприклад:

{
  "extends": "eslint:recommended",
  "rules": {
    "indent": ["error", 2],
    "quotes": ["error", "single"],
    "semi": ["error", "always"]
  },
  "env": {
    "browser": true,
    "node": true
  }
}

  • Запуск ESLint: Для аналізу коду за допомогою ESLint, запустіть наступну команду:

npx eslint yourfile.js

ESLint проаналізує файл yourfile.js та покаже порушення визначених правил.

  • Автоматичне виправлення коду: ESLint також дозволяє автоматично виправляти деякі порушення. Щоб скористатися цією можливістю, запустіть:

npx eslint --fix yourfile.js

ESLint виправить код згідно з визначеними правилами.

Отже, використовуючи ESLint, можна підтримувати якість коду JavaScript на високому рівні, виявляти та виправляти потенційні проблеми та порушення стандартів кодування. Це корисно для розробників, оскільки допомагає забезпечити сумісність коду з рекомендаціями команди, поліпшити зрозумілість коду та зменшити ймовірність виникнення помилок.

PYLINT

Pylint – це інструмент статичного аналізу коду, який допомагає виявити потенційні проблеми та недоліки в коді Python. Він використовує набір правил для аналізу та перевірки стилю коду, відповідності стандарту PEP 8, а також можливих помилок і проблем.

Приклад використання Pylint:

  • Встановлення Pylint: Перш ніж розпочати роботу з Pylint, потрібно встановити його за допомогою pip (Python package manager):

pip install pylint
  • Конфігурація Pylint: Для налаштування правил Pylint у проекті створіть файл .pylintrc та визначте потрібні правила. Наприклад:

[MESSAGES CONTROL]
disable=W1203

[FORMAT]
max-line-length=120
  • Запуск Pylint: Для аналізу коду за допомогою Pylint, запустіть наступну команду:

pylint yourfile.py

Pylint проаналізує файл yourfile.py та покаже порушення визначених правил.

  • Аналіз результатів: Pylint виводить результати аналізу у вигляді звіту з рейтингом коду, описом порушень та рекомендаціями щодо їх виправлення.

Використовуючи Pylint, можна підтримувати якість коду Python на високому рівні, виявляти та виправляти потенційні проблеми та порушення стандартів кодування. Це корисно для розробників, оскільки допомагає забезпечити сумісність коду з рекомендаціями команди, поліпшити зрозумілість коду та зменшити ймовірність виникнення помилок.

SonarQube

SonarQube – це комплексний інструмент статичного аналізу коду, який допомагає виявити потенційні проблеми, уразливості та недоліки в коді для ряду мов програмування. Він використовує набір правил для аналізу та перевірки стилю коду, безпеки, а також можливих помилок і проблем.

Приклад використання SonarQube:

  • Встановлення SonarQube: Спочатку потрібно завантажити та встановити сервер SonarQube з офіційного сайту https://www.sonarqube.org/downloads/. Слід встановити також SonarQube Scanner, що відповідає за аналіз коду.
  • Конфігурація SonarQube: Для налаштування правил SonarQube у проекті створіть файл sonar-project.properties та визначте параметри проекту. Наприклад:

sonar.projectKey=my_project_key
sonar.projectName=My Project
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=java
sonar.sourceEncoding=UTF-8

  • Запуск SonarQube та аналіз коду: Запустіть сервер SonarQube та виконайте аналіз коду за допомогою SonarQube Scanner:

sonar-scanner
  • Перегляд результатів: Відкрийте веб-інтерфейс SonarQube (зазвичай доступний за адресою https://localhost:9000) та перегляньте результати аналізу коду, у тому числі уразливості, помилки, порушення стандартів кодування та інші показники якості коду.

Використовуючи SonarQube, можна підтримувати якість коду на високому рівні, виявляти та виправляти потенційні проблеми, уразливості та порушення стандартів кодування. Це корисно для розробників, оскільки допомагає забезпечити сумісність

Методи динамічного тестування: перевіряємо програму в дії

  1. Модульне тестування – перевірка окремих компонентів програми на правильність роботи та відповідність вимогам.
  2. Інтеграційне тестування – перевірка взаємодії між модулями програми та їх спільної роботи.
  3. Системне тестування – перевірка повної системи на предмет відповідності вимогам та правильності роботи в реальних умовах.
  4. Приймальне тестування – перевірка програми з боку замовника або користувачів на відповідність їх потребам та вимогам.

Інструменти для динамічного тестування: автоматизуємо процес

JUnit

JUnit – це фреймворк для модульного тестування програм на Java, який спрощує процес створення та проведення тестів, дозволяючи автоматизувати перевірку коректності коду. Він широко використовується розробниками для написання та виконання тестових сценаріїв, що перевіряють окремі компоненти програми.

Приклад використання JUnit:

  • Встановлення JUnit: Щоб використовувати JUnit, спочатку потрібно додати його залежність у файл pom.xml (для проектів на основі Maven) або build.gradle (для проектів на основі Gradle).

Для Maven:

Для Gradle:


testImplementation 'junit:junit:4.13.2'
  • Створення тестового класу: Створіть клас для тестів, який буде включати методи тестування. Назва тестового класу повинна відповідати назві класу, який ви тестуєте, з суфіксом “Test”.

import org.junit.Test;
import static org.junit.Assert.*;

public class MyClassTest {
  // Тестові методи
}

  • Написання тестових методів: Для кожного тестового сценарію створіть метод та анотуйте його @Test. У тестовому методі використовуйте методи assert для перевірки очікуваних результатів.

@Test
public void testAddition() {
  MyClass myClass = new MyClass();
  int result = myClass.addition(2, 3);
  assertEquals("Addition of 2 and 3 should be 5", 5, result);
}

  • Запуск тестів: Запустіть тестовий клас, використовуючи середовище розробки (IDE) або систему збірки (Maven або Gradle). Перегляньте результати тестів та внесіть необхідні зміни у код, якщо виявлено помилки.

Використовуючи JUnit для модульного тестування, можна забезпечити високу якість коду та зменшити кількість помилок та проблем у програмі. Це корисно для розробників, оскільки автоматизовані тести допомагають перевірити, чи поводиться код очікуваним чином під час змін та рефакторингу. Крім того, JUnit сприяє покращенню стабільності програми, дозволяючи знайти та виправити помилки на ранніх етапах розробки.

Розглянемо ще один приклад використання JUnit:


import org.junit.Test;
import static org.junit.Assert.*;

public class StringHelperTest {
  
  @Test
  public void testReverse() {
    StringHelper stringHelper = new StringHelper();
    String result = stringHelper.reverse("hello");
    assertEquals("Reverse of 'hello' should be 'olleh'", "olleh", result);
  }
  
  @Test
  public void testConcatenate() {
    StringHelper stringHelper = new StringHelper();
    String result = stringHelper.concatenate("Hello", "World");
    assertEquals("Concatenation of 'Hello' and 'World' should be 'HelloWorld'", "HelloWorld", result);
  }
}

У цьому прикладі ми створили тестовий клас StringHelperTest, який містить два тестових методи: testReverse() та testConcatenate(). Кожен метод тестує окремий аспект роботи класу StringHelper, перевіряючи коректність його методів reverse() та concatenate(). Запускаючи ці тести, ми можемо переконатися, що реалізація класу StringHelper працює належним чином і відповідає нашим очікуванням.

Selenium

Selenium – це потужний інструмент для автоматизації тестування веб-додатків, який забезпечує засоби для імітації дій користувачів в реальних браузерах. Він підтримує різні мови програмування, такі як Java, Python, C# та Ruby, і дозволяє розробникам писати тести, що відповідають різним браузерам та платформам. Selenium допомагає перевіряти взаємодію користувача з веб-додатком та виявляти можливі проблеми в його роботі.

Розглянемо простий приклад використання Selenium для автоматизації тестування веб-додатку на Python:


import org.junit.Test;
import static org.junit.Assert.*;

public class StringHelperTest {
  
  @Test
  public void testReverse() {
    StringHelper stringHelper = new StringHelper();
    String result = stringHelper.reverse("hello");
    assertEquals("Reverse of 'hello' should be 'olleh'", "olleh", result);
  }
  
  @Test
  public void testConcatenate() {
    StringHelper stringHelper = new StringHelper();
    String result = stringHelper.concatenate("Hello", "World");
    assertEquals("Concatenation of 'Hello' and 'World' should be 'HelloWorld'", "HelloWorld", result);
  }
}

У цьому прикладі ми створили тестовий клас TestGoogleSearch, який наслідується від класу unittest.TestCase. В методі setUp ми ініціалізуємо веб-драйвер (у нашому випадку – Chrome). В методі test_search_in_google ми відкриваємо сторінку Google, знаходимо поле пошуку, вводимо туди слово “Selenium” та натискаємо Enter. Після цього ми перевіряємо, чи з’явилося слово “Selenium” в заголовку сторінки. В методі tearDown ми закриваємо веб-драйвер. Запустивши цей тест, ми можемо переконатися, що пошук в Google працює належним чином.

Слід зазначити, що Selenium надає різні варіанти запуску тестів, такі як використання віртуальних машин, паралельного запуску тестів та інтеграції з системами неперервної інтеграції та розгортання, такими як Jenkins, Travis CI та GitLab CI/CD. Це робить Selenium ідеальним інструментом для автоматизації тестування в сучасних веб-розробках.

Ось декілька ключових переваг використання Selenium:

  1. Підтримка різних мов програмування: Selenium дозволяє вам писати тести на різних мовах програмування, що забезпечує гнучкість та зручність для розробників.
  2. Кросбраузерне тестування: Selenium підтримує різні браузери, такі як Chrome, Firefox, Safari, Edge та Opera, що дозволяє вам перевіряти сумісність вашого додатка з різними браузерами та платформами.
  3. Віддалене тестування: Selenium дозволяє проводити віддалене тестування на різних серверах та платформах, що полегшує налаштування тестового середовища та розгортання тестів.
  4. Інтеграція з іншими інструментами: Selenium легко інтегрується з іншими інструментами, такими як тестирувальні фреймворки, системи збірки, системи неперервної інтеграції та інші інструменти розробки.
  5. Гнучкість та масштабованість: Selenium надає гнучкість та масштабованість для створення та виконання тестів у великих проектах та командами розробників.

Використовуючи Selenium для автоматизації тестування веб-додатків, розробники можуть забезпечити більш надійну роботу своїх програм, економлячи час та ресурси на ручне тестування. Завдяки своїм можливостям та гнучкості, Selenium є одним з найпопулярніших інструментів для автоматизації тестування веб-додатків на сьогоднішній день.

Ось ще один приклад використання Selenium для автоматизації тестування веб-додатку на Java:


import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestLoginFunctionality {

    private WebDriver driver;

    @BeforeEach
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        driver = new ChromeDriver();
    }

    @Test
    public void testLogin() {
        driver.get("https://example.com/login");
        WebElement usernameField = driver.findElement(By.name("username"));
        WebElement passwordField = driver.findElement(By.name("password"));
        WebElement submitButton = driver.findElement(By.name("submit"));

        usernameField.sendKeys("testUser");
        passwordField.sendKeys("testPassword");
        submitButton.click();

        String expectedUrl = "https://example.com/dashboard";
        assertEquals(expectedUrl, driver.getCurrentUrl());
    }

    @AfterEach
    public void tearDown() {
        driver.quit();
    }
}

У цьому прикладі ми створили тестовий клас TestLoginFunctionality, який використовує JUnit 5. В методі setUp ми ініціалізуємо веб-драйвер Chrome, а в методі tearDown закриваємо його. В тестовому методі testLogin ми відкриваємо сторінку входу, вводимо дані для логіну та пароля, а потім натискаємо кнопку входу. Нарешті, ми перевіряємо, чи перенаправлення відбулося на очікувану сторінку.

Використовуючи Selenium, розробники можуть автоматизувати тестування веб-додатків та переконатися, що їх програми працюють належним чином у різних браузерах та платформах. Це дозволяє знайти та виправити помилки швидше, покращуючи якість продукту та забезпечуючи кращий досвід користувача.

TestNG

TestNG – це потужний фреймворк для модульного тестування програм на Java, який розроблений з урахуванням потреб сучасних проектів та дозволяє автоматизувати процес створення та проведення тестів. TestNG надає розширений набір функцій порівняно з JUnit та пропонує більш гнучку конфігурацію для виконання тестів. Деякі основні відмінності та переваги TestNG включають:

  1. Підтримка паралельного виконання тестів: TestNG дозволяє виконувати декілька тестів паралельно, що може значно зменшити загальний час тестування.
  2. Гнучке управління конфігурацією: TestNG використовує XML-файли для налаштування тестів, що дозволяє вам визначати групи тестів, включати або виключати окремі тести, виконувати тести в певному порядку тощо.
  3. Анотації: TestNG використовує анотації для визначення тестів, встановлення залежностей між тестами та виконання дій перед та після тестів. Це спрощує створення та розширення тестових сценаріїв.
  4. Відображення результатів тестування: TestNG генерує зрозумілі й деталізовані звіти про результати тестування, що дозволяє легко аналізувати та відстежувати прогрес тестування.

Ось приклад тестування за допомогою TestNG:


import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

public class CalculatorTest {

    private Calculator calculator;

    @BeforeMethod
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testAddition() {
        int result = calculator.add(2, 3);
        assertEquals(result, 5);
    }

    @Test
    public void testSubtraction() {
        int result = calculator.subtract(5, 3);
        assertEquals(result, 2);
    }

    @AfterMethod
    public void tearDown() {
        calculator = null;
    }
}

У цьому прикладі ми використовуємо TestNG для тестування класу Calculator, який містить прості операції додавання та віднімання. Ми використовуємо анотації @BeforeMethod, @Test та @AfterMethod для визначення тестових методів та дій, які виконуються перед та після кожного тесту. TestNG гарантує правильне виконання тестів та генерує звіти з результатами тестування.

  1. @BeforeMethod: ця анотація вказує, що метод setUp() має виконуватися перед кожним тестовим методом. У нашому випадку ми ініціалізуємо екземпляр класу Calculator.
  2. @Test: анотація @Test вказує, що метод є тестовим методом, який має бути виконаний TestNG. В нашому прикладі ми маємо два тестових методи: testAddition() та testSubtraction(), які перевіряють коректність додавання та віднімання відповідно.
  3. @AfterMethod: анотація @AfterMethod вказує, що метод tearDown() має виконуватися після кожного тестового методу. У нашому випадку ми звільняємо ресурси, присвоюючи null екземпляру класу Calculator.

Таким чином, використання TestNG у якості інструменту для динамічного тестування дозволяє створювати модульні, гнучкі та легко розширювані тестові сценарії з автоматизованою перевіркою результатів та звітності.

Висновки: поєднуємо сили статичного та динамічного тестування

Статичне та динамічне тестування є важливими методами контролю якості програмного забезпечення. Кожен з методів має свої переваги та недоліки, тому найкращим рішенням є їх поєднання для досягнення максимальної ефективності тестування.

Застосування статичного тестування на ранніх стадіях розробки допомагає виявити помилки ще до виконання коду, що забезпечує економію часу та ресурсів. Динамічне тестування, в свою чергу, перевіряє реальну роботу програми та її відповідність вимогам.

Використання відповідних інструментів для статичного та динамічного тестування сприяє автоматизації процесу та забезпечує високий рівень якості програмного забезпечення.

На курсах тестування програмного забезпечення наші ментори навчать вас різноманітним методам тестування, що дозволить вам стати професіональним QA інженером.

Site Footer