Модульное тестирование с использованием юнит-теста в Python3 - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно написать тестовые случаи, используя модульный тест в python для создания круга тестирования.

  • Определить класс Circle с помощью метода init , который инициализирует цикл с радиусом атрибута, имеяследующие ограничения.а.радиус должен быть числовым значением, в противном случае возникает ошибка типа с сообщением об ошибке «радиус должен быть числом».

b.радиус должен составлять от 0 до 1000 включительно с обеих сторон, если не увеличено значение ошибки с сообщением об ошибке «радиус должен составлять от 0 до 1000 включительно»

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

Завершите определение класса TestingCircleCreation, который проверяет поведение метода init , как указано ниже.

  • Определить метод теста 'test_creating_circle_with_numeric_radius', который создает круг с радиусом 2.5 и проверяет, соответствует ли радиус значению 2.5

  • Определить метод теста test_creating_circle_with_negative_radius, который проверяет, имеет ли значениеВозникает исключение ошибки с сообщением об ошибке «радиус должен быть от 0 до 1000 включительно», при создании круга радиуса 2.5.

  • Определите метод теста test_creating_circle_with_greaterthan_radius, который проверяет, возникло ли исключение ValueErrorс сообщением об ошибке «радиус должен быть между 0 и 1000 включительно», при создании круга радиуса 1000.1.

  • Определите метод теста test_creating_circle_with_nonnumeric_radius, который cчерт возьми, если исключение TypeError вызывается с сообщением об ошибке «радиус должен быть числом» при создании круга радиуса «привет».

Я пробовал ниже, но это происходит с ошибкой, как

Traceback (most recent call last):
  File "..\Playground\", line 86, in <module>
    pass_count = pass_count[0]
IndexError: list index out of range

код:

import inspect
import re
import unittest
import math

# Define below the class 'Circle' and it's methods with proper doctests.
class Circle:

    def __init__(self, radius):
        # Define the initialization method below
        try:
            if not isinstance(radius, (int, float)):
                raise TypeError 
            elif 1000 >=radius>=0:
                    self.radius=radius 
            else:
                raise ValueError        
        except ValueError:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        except TypeError:
            raise TypeError("radius must be a number")

    def area(self):
        # Define the area functionality below
        y=math.pi*(self.radius**2)
        return round(y,2)

    def circumference(self):
        # Define the circumference functionality below
        x=math.pi*2*self.radius
        return round(x,2)

class TestCircleCreation(unittest.TestCase):

    def test_creating_circle_with_numeric_radius(self):
        # Define a circle 'c1' with radius 2.5 and check if 
        # the value of c1.radius equal to 2.5 or not
        c1=Circle(2.5)        
        self.assertEqual(c1.radius,2.5)

    def test_creating_circle_with_negative_radius(self):
        # Try Defining a circle 'c' with radius -2.5 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"
        c=Circle(-2.5)
        self.assertEqual(c.radius,-2.5)
        self.assertRaises(ValueError)      

    def test_creating_circle_with_greaterthan_radius(self):
        # Try Defining a circle 'c' with radius 1000.1 and see 
        # if it raises a ValueError with the message
        # "radius must be between 0 and 1000 inclusive"
        c=Circle(1000.1)        
        self.assertEqual(c.radius,1000.1)
        self.assertRaises(ValueError)        

    def test_creating_circle_with_nonnumeric_radius(self):
        # Try Defining a circle 'c' with radius 'hello' and see 
        # if it raises a TypeError with the message
        # "radius must be a number"
        c=Circle('hello')      
        self.assertEqual(c.radius,'hello')
        self.assertRaises(TypeError)        

if __name__ == '__main__':

    fptr = open('output.txt', 'w')

    runner = unittest.TextTestRunner(fptr)

    unittest.main(testRunner=runner, exit=False)

    fptr.close()

    with open('output.txt') as fp:
        output_lines = fp.readlines()


    pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                     and line.endswith('.\n')]


    pass_count = pass_count[0]

    print(str(pass_count))

    doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
    doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
    doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
    doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)

    assert1_count = len(re.findall(r'assertEqual', doc1))

    print(str(assert1_count))

    assert1_count = len(re.findall(r'assertEqual', doc2))
    assert2_count = len(re.findall(r'assertRaises', doc2))

    print(str(assert1_count), str(assert2_count))

    assert1_count = len(re.findall(r'assertEqual', doc3))
    assert2_count = len(re.findall(r'assertRaises', doc3))

    print(str(assert1_count), str(assert2_count))

    assert1_count = len(re.findall(r'assertEqual', doc4))
    assert2_count = len(re.findall(r'assertRaises', doc4))

    print(str(assert1_count), str(assert2_count))

Ответы [ 2 ]

0 голосов
/ 07 августа 2019

import inspect import re import unittest import математика

Определите ниже класса 'Circle' и его методы с соответствующими документами.

class Circle:

def __init__(self, radius):
    # Define the initialization method below
    try:
        if not isinstance(radius, (int, float)):
            raise TypeError 
        elif 1000 >=radius>=0:
                self.radius=radius 
        else:
            raise ValueError        
    except ValueError:
        raise ValueError("radius must be between 0 and 1000 inclusive")
    except TypeError:
        raise TypeError("radius must be a number")

def area(self):
    # Define the area functionality below
    y=math.pi*(self.radius**2)
    return round(y,2)

def circumference(self):
    # Define the circumference functionality below
    x=math.pi*2*self.radius
    return round(x,2)

classTestCircleCreation (unittest.TestCase):

def test_creating_circle_with_numeric_radius(self):
    # Define a circle 'c1' with radius 2.5 and check if 
    # the value of c1.radius equal to 2.5 or not
    c1 = Circle(2.5)        
    self.assertEqual(c1.radius, 2.5)

def test_creating_circle_with_negative_radius(self):
    # Try Defining a circle 'c' with radius -2.5 and see 
    # if it raises a ValueError with the message
    # "radius must be between 0 and 1000 inclusive"
    c1 = Circle(2.5)        
    self.assertEqual(c1.radius, 2.5)

    with self.assertRaises(ValueError) as E:
        c = Circle(-2.5)     

def test_creating_circle_with_greaterthan_radius(self):
    # Try Defining a circle 'c' with radius 1000.1 and see 
    # if it raises a ValueError with the message
    # "radius must be between 0 and 1000 inclusive"

    c1 = Circle(2.5)        
    self.assertEqual(c1.radius, 2.5)
    with self.assertRaises(ValueError) as E:
        c = Circle(1000.1)        

def test_creating_circle_with_nonnumeric_radius(self):
    # Try Defining a circle 'c' with radius 'hello' and see 
    # if it raises a TypeError with the message
    # "radius must be a number"

    c1 = Circle(2.5)        
    self.assertEqual(c1.radius, 2.5)

    with self.assertRaises(TypeError) as E:
        c = Circle('hello')        

, если имя == ' main ':

fptr = open('output.txt', 'w')

runner = unittest.TextTestRunner(fptr)

unittest.main(testRunner=runner, exit=False)

fptr.close()

with open('output.txt') as fp:
    output_lines = fp.readlines()


pass_count = [ len(re.findall(r'\.', line)) for line in output_lines if line.startswith('.')
                 and line.endswith('.\n')]


pass_count = pass_count[0]

print(str(pass_count))

doc1 = inspect.getsource(TestCircleCreation.test_creating_circle_with_numeric_radius)
doc2 = inspect.getsource(TestCircleCreation.test_creating_circle_with_negative_radius)
doc3 = inspect.getsource(TestCircleCreation.test_creating_circle_with_greaterthan_radius)
doc4 = inspect.getsource(TestCircleCreation.test_creating_circle_with_nonnumeric_radius)

assert1_count = len(re.findall(r'assertEqual', doc1))

print(str(assert1_count))

assert1_count = len(re.findall(r'assertEqual', doc2))
assert2_count = len(re.findall(r'assertRaises', doc2))

print(str(assert1_count), str(assert2_count))

assert1_count = len(re.findall(r'assertEqual', doc3))
assert2_count = len(re.findall(r'assertRaises', doc3))

print(str(assert1_count), str(assert2_count))

assert1_count = len(re.findall(r'assertEqual', doc4))
assert2_count = len(re.findall(r'assertRaises', doc4))

print(str(assert1_count), str(assert2_count))
0 голосов
/ 10 февраля 2019

Я удалил повторные self.assertEqual(c.radius,-2.5) утверждения, так как они уже обработаны другим модульным тестом (test_creating_circle_with_numeric_radius(self)), и из-за этого ваши юнит-тесты провалились.Смотрите здесь, например:

    def test_creating_circle_with_negative_radius(self):
        c=Circle(-2.5)
        self.assertEqual(c.radius,-2.5) # Throwing ValueError
        self.assertRaises(ValueError)

В вашем коде assertEquals(c.radius,-2.5) пытается определить, равно ли значение c.radius -2,5.Это значение не установлено, потому что -2.5 находится вне допустимого диапазона и вместо него выдается ошибка ValueError.Это предотвращает проверку self.assertRaises(ValueError).Удаляя assertEquals из тестов и оставляя его в качестве собственного независимого теста, self.assertRaises(ValueError) выполняется и позволяет вам увидеть, где ваш код не соответствует требованиям.

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

    with open('output.txt', 'w') as fptr:
        runner = unittest.TextTestRunner(fptr)
        unittest.main(testRunner=runner, exit=False)

Ваши чеки можно было бы упростить с

        try:
            if not isinstance(radius, (int, float)):
                raise TypeError 
            elif 1000 >=radius>=0:
                    self.radius=radius 
            else:
                raise ValueError        
        except ValueError:
            raise ValueError("radius must be between 0 and 1000 inclusive")
        except TypeError:
            raise TypeError("radius must be a number")

до:

            if not isinstance(radius, (int, float)):
                raise TypeError("radius must be a number")

            if not 1000 >=radius>=0:
                raise ValueError("radius must be between 0 and 1000 inclusive")

            self.radius=radius 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...