Тестирование мутаций с использованием модуля Mutpy в Python

Опубликовано: 18 Февраля, 2022

Предварительное условие: тестирование мутаций

Mutpy - это инструмент тестирования мутаций в Python, который генерирует мутантов и вычисляет оценку мутаций. Он поддерживает стандартный модуль unittest, генерирует отчеты YAML / HTML и имеет красочный вывод. Он применяет мутации на уровне AST.

Установка:

Этот модуль не встроен в Python. Чтобы установить его, введите в терминале следующую команду.

 pip install mutpy

Здесь мы будем использовать библиотеку Mutpy для выполнения тестовых примеров, написанных для простой программы.

Теперь мы выполняем тестирование мутаций для программы, которая проверяет, является ли число простым или нет .

Code: This code is save as isPrime.py

Python3

# define a function 
def isPrime(num):
  
    if num > 1:
        
       # check for factors
       for i in range(2,num):
           if (num % i) == 0:
               return False
  
       else:
           return True
             
    # if input number is less than
    # or equal to 1, it is not prime
    else:
       return False;

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

Тестовые примеры написаны с использованием self.assertEqual (), которое является тестовым утверждением, обычно используемым для определения того, прошел ли тестовый пример или нет. Ниже мы написали три тестовые функции, чтобы проверить три типа ввода:

  1. Вход простой
  2. Вход не является простым
  3. Ввод недействителен

Примечание. Имя функции и имя тестового файла всегда должны начинаться со слова «test».

Code: This code is save as test_isPrime.py.

Python3

# import required libraries
from unittest import TestCase
from isPrime import isPrime
  
# define a class
class CalculatorTest(TestCase):
      
    # test case for checking non prime nums
    def test_nonprime(self):
        self.assertEqual(isPrime(12),False)
      
    # test case to check prime nums
    def test_prime(self):
        self.assertEqual(isPrime(19),True)
  
    # test case to check invalid input
    def test_invalid(self):
        self.assertEqual(isPrime(-1),False)

Чтобы выполнить эти тестовые примеры, нам нужно создать два отдельных файла isPrime.py и test_isPrime.py в одной папке и выполнить следующую команду в командной строке:

 mut.py --target isPrime --unit-test test_isPrime -m --runner pytest

В приведенной выше команде мы должны указать три вещи:

  • Target: целевой файл, в котором будут запускаться тестовые примеры, в нашем случае isPrime.py.
  • Модульный тест: файл, содержащий модульные тесты, которые необходимо выполнить, то есть test_isPrime.py в нашем случае.
  • Бегун: pytest или unittest

Результатом будет набор мутантов с такими деталями, как оценка мутаций, количество убитых, выживших мутаций и т. Д.

 [*] Запустить процесс мутации:
   - цели: isPrime
   - тесты: test_isPrime
[*] Пройдено 3 теста:
   - test_isPrime [3,07469 с]
[*] Запуск генерации и исполнения мутантов:
   - [# 1] AOR isPrime:
-------------------------------------------------- ------------------------------
   3:
   4: если число> 1:
   5:
   6: для i в диапазоне (2, число):
- 7: если число% i == 0:
+ 7: если num * i == 0:
   8: вернуть ложь
   9: еще:
  10:
  11: вернуть True
-------------------------------------------------- ------------------------------
[1.45151 с] убита программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_nonprime
   - [# 2] COI isPrime:
-------------------------------------------------- ------------------------------
   1:
   2: def isPrime (число):
   3:
- 4: если число> 1:
+ 4: если нет (число> 1):
   5:
   6: для i в диапазоне (2, число):
   7: если число% i == 0:
   8: вернуть ложь
-------------------------------------------------- ------------------------------
[1.25723 с] убита программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_invalid
   - [# 3] COI isPrime:
-------------------------------------------------- ------------------------------
   3:
   4: если число> 1:
   5:
   6: для i в диапазоне (2, число):
- 7: если число% i == 0:
+ 7: если нет (число% i == 0):
   8: вернуть ложь
   9: еще:
  10:
  11: вернуть True
-------------------------------------------------- ------------------------------
[1.28817 с] убита программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_prime
   - [# 4] CRP isPrime:
-------------------------------------------------- ------------------------------
   1:
   2: def isPrime (число):
   3:
- 4: если число> 1:
+ 4: если число> 2:
   5:
   6: для i в диапазоне (2, число):
   7: если число% i == 0:
   8: вернуть ложь
-------------------------------------------------- ------------------------------
[1.23510 с] выжил
   - [# 5] CRP isPrime:
-------------------------------------------------- ------------------------------
   2: def isPrime (число):
   3:
   4: если число> 1:
   5:
- 6: для i в диапазоне (2, число):
+ 6: для i в диапазоне (3, число):
   7: если число% i == 0:
   8: вернуть ложь
   9: еще:
  10:
-------------------------------------------------- ------------------------------
[1.20360 с] выжили
   - [# 6] CRP isPrime:
-------------------------------------------------- ------------------------------
   3:
   4: если число> 1:
   5:
   6: для i в диапазоне (2, число):
- 7: если число% i == 0:
+ 7: если число% i == 1:
   8: вернуть ложь
   9: еще:
  10:
  11: вернуть True
-------------------------------------------------- ------------------------------
[1.23499 с] убита программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_prime
   - [# 7] ROR isPrime:
-------------------------------------------------- ------------------------------
   1:
   2: def isPrime (число):
   3:
- 4: если число> 1:
+ 4: если число <1:
   5:
   6: для i в диапазоне (2, число):
   7: если число% i == 0:
   8: вернуть ложь
-------------------------------------------------- ------------------------------
[1.24164 с] убит программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_invalid
   - [# 8] ROR isPrime:
-------------------------------------------------- ------------------------------
   1:
   2: def isPrime (число):
   3:
- 4: если число> 1:
+ 4: если число> = 1:
   5:
   6: для i в диапазоне (2, число):
   7: если число% i == 0:
   8: вернуть ложь
-------------------------------------------------- ------------------------------
[1.21934 s] выжил
   - [# 9] ROR isPrime:
-------------------------------------------------- ------------------------------
   3:
   4: если число> 1:
   5:
   6: для i в диапазоне (2, число):
- 7: если число% i == 0:
+ 7: если число% i! = 0:
   8: вернуть ложь
   9: еще:
  10:
  11: вернуть True
-------------------------------------------------- ------------------------------
[1.32597 с] убита программой тестирования mutpy / test_isPrime.py :: CalculatorTest :: test_prime
[*] Оценка мутации [14.91747 с]: 66,7%
   - всего: 9
   - убито: 6 (66,7%)
   - выжили: 3 (33,3%)
   - некомпетентный: 0 (0,0%)
   - таймаут: 0 (

Как видно из выходных данных, 6 мутантов были убиты, и только 3 мутанта смогли выжить. Также была достигнута оценка мутации 66,7%. Мы можем дополнительно улучшить этот показатель мутации, анализируя мутантов, которые выжили в тестовых примерах, и написав новые или изменив тестовые примеры, чтобы убить выживших мутантов.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.