Выполнение тестирования BVA с использованием Pytest

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

Предварительное условие - Тестирование BVA

Чтобы выполнить автоматическое тестирование BVA (анализ граничных значений), мы можем использовать библиотеки Pytest или Unittest в Python. Здесь мы будем использовать библиотеку Pytest для выполнения тестовых примеров, написанных для простой программы.

Мы будем выполнять BVA-тестирование для программы, которая определяет тип треугольника (т.е. равносторонний, равнобедренный, чешуйчатый или, если формирование треугольника невозможно), когда заданы длины его сторон A, B и C. Кроме того, диапазон длины составляет от 10 до 50 (оба включительно).

Code in triangletype.py file:

Python3

# import math
class Error(BaseException):
    pass
  
class OutOfRangeError(Error):
    def __init__(self, message):
        self.message = message
  
class TriangleError(Error):
    def __init__(self, message):
        self.message = message
  
def checkRange(a, b, c):
    if a<10 or a>50:
        raise OutOfRangeError("A is out of the given range")
    if b<10  or b>50:
        raise OutOfRangeError("B is out of the given range"
    if c<10 or c>50:
        raise OutOfRangeError("C is out of the given range")
  
def checkTriangle(a, b, c):
    if a + b<= c or b + c<= a or c + a<= b:
        raise TriangleError("Triangle cannot be formed with these sides")
  
def triangleType(a, b, c):
    checkRange(a, b, c)
    checkTriangle(a, b, c)
    # s = (a + b+c)/2
    # ar = math.sqrt(s*(s-a)*(s-b)*(s-c))
    # inradius = ar / s
    if(a == b and b == c):   
        return "Equilateral Triangle"
    elif(a == b or a == c or b == c):
        return "Isosceles Triangle"
    else:
        return "Scalene Triangle"
  
  
def main():
    try:
        print("Enter the sides of the triangle in range [10-50]")
  
        a = int(input("Enter Side A:"))
        b = int(input("Enter Side B:"))
        c = int(input("Enter Side C:"))
    except ValueError as v:
        print(v + " Raised :Input is not an integer.")
        exit(0)
    try:
        checkRange(a, b, c)
    except OutOfRangeError as e:
        print("OutOfRangeError:" + e.message)
      
    try:
        checkTriangle(a, b, c)
    except TriangleError as e:
        print("TriangleError:" + e.message)
  
    typeOfTriangle = triangleType(a, b, c)
  
    print("The triangle is: " + typeOfTriangle)
  
if __name__ == "__main__":
    main()

Теперь нам нужно написать тестовые примеры для указанной выше программы, используя библиотеку Pytest. Каждый тестовый пример написан в отдельной функции, где мы используем функцию pytest.raises для проверки того, что данный ввод действителен или недействителен. В BVA используются 3 метода: проверка граничных значений (BVC), проверка устойчивости и проверка наихудшего случая. Здесь мы проведем тестирование на устойчивость, где для n входных переменных можно написать 6n + 1 тестовых примеров.

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

 В приведенной выше программе

п = 3
Поскольку количество тестов = 6n + 1
Следовательно, 
Количество тестовых случаев = 6 * 3 + 1 
             = 19 тестовых случаев  

Следовательно, мы пишем 19 тестовых примеров для вышеуказанной программы для следующих значений: min, min - 1, min + 1, max, max - 1, max + 1 и номинальное значение.

Code in test_triangletype_bva.py file: 

Python3

import pytest
from triangletype import triangleType
from triangletype import OutOfRangeError
  
def test_bva_minm_a():
    with pytest.raises(OutOfRangeError):
        triangleType(9, 20, 15)
def test_bva_minm_b():
    with pytest.raises(OutOfRangeError):
        triangleType(20, 9, 15)
def test_bva_minm_c():
    with pytest.raises(OutOfRangeError):
        triangleType(20, 15, 9)
  
def test_bva_min_a():
    assert triangleType(10, 20, 15) == "Scalene Triangle" 
def test_bva_min_b():
    assert triangleType(20, 10, 15) == "Scalene Triangle" 
def test_bva_min_c():
    assert triangleType(15, 20, 10) == "Scalene Triangle" 
  
def test_bva_minp_a():
    assert triangleType(11, 20, 15) == "Scalene Triangle" 
def test_bva_minp_b():
    assert triangleType(20, 11, 15) == "Scalene Triangle"  
def test_bva_minp_c():
    assert triangleType(15, 20, 11) == "Scalene Triangle"  
  
def test_bva_maxm_a():
    assert triangleType(49, 30, 45) == "Scalene Triangle"
def test_bva_maxm_b():
    assert triangleType(30, 49, 45) == "Scalene Triangle"        
def test_bva_maxm_c():
    assert triangleType(45, 30, 49) == "Scalene Triangle"    
  
def test_bva_max_a():
    assert triangleType(50, 30, 45) == "Scalene Triangle"
def test_bva_max_b():
    assert triangleType(30, 50, 45) == "Scalene Triangle" 
def test_bva_max_c():
    assert triangleType(45, 30, 50) == "Scalene Triangle" 
  
def test_bva_maxp_a():
    with pytest.raises(OutOfRangeError):
        triangleType(51, 30, 45)
def test_bva_maxp_b():
    with pytest.raises(OutOfRangeError):
        triangleType(30, 51, 45)
def test_bva_maxp_c():
    with pytest.raises(OutOfRangeError):
        triangleType(30, 45, 51)
  
def test_bva_nominal():
    assert triangleType(12, 12, 12) == "Equilateral Triangle"

Для выполнения указанных выше тестов, создать два отдельных файла triangletype.py и test_triangletype_bva.py в одной папке. Для выполнения напишите следующую команду:

 pytest 

ИЛИ

 pytest -v

pytest -v показывает подробный вывод.

Результат показан ниже:

Как видно из выходных данных, все 19 тестовых случаев пройдены. Однако, если мы отредактируем тестовые примеры таким образом, что ввод недопустим, тогда тестовые примеры не пройдут. Например, если мы изменим значение переменной c в тестовом примере test_bva_max_c () в файле test_triangletype_bva.py , то результат будет следующим:

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

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