Главная страница

Решение задачи на обработку массива


Скачать 56.92 Kb.
НазваниеРешение задачи на обработку массива
Дата19.06.2022
Размер56.92 Kb.
Формат файлаdocx
Имя файлаAVTONOMNAYa_NEKOMMERChESKA1.docx
ТипКурсовая
#604296
страница2 из 3
1   2   3

Что такое модульный тест?

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

Python предоставляет модуль unittest для тестирования единицы исходного кода. Модульный тест играет важную роль, когда мы пишем огромный код, и он предоставляет возможность проверить правильность вывода.

Обычно мы печатаем значение и сравниваем его с эталонным выводом или проверяем вывод вручную. Этот процесс занимает много времени. Чтобы решить эту проблему, Python представляет модуль unittest. Мы также можем проверить производительность приложения, используя его.

Мы узнаем, как создать базовый тест, найти ошибки и выполнить его до того, как код будет доставлен пользователям.

Автоматическое и ручное тестирование кода

Мы можем протестировать наш код разными способами. У ручного тестирования есть еще одна форма, известная как исследовательское тестирование, которое проводится без всякого плана. Для ручного тестирования нам необходимо подготовить список приложений; мы вводим разные входы и ждем ожидаемого результата.

Каждый раз, когда мы вводим вход или меняем код, нам нужно просмотреть каждую функцию списка и проверить ее.

Это наиболее распространенный способ, но трудоемки.

Автоматическое тестирование выполняет код в соответствии с нашим планом кода, что означает, что оно запускает часть кода для тестирования в том порядке, в котором мы хотим проверить ее с помощью сценария, а не человека.

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

2.0Модульные и интеграционные тесты

Предположим, мы хотим проверить фары автомобиля и выбрать способ их проверки. Мы включали свет и выходили из машины или спрашивали друга, включен свет или нет. Включение света будет считаться тестовым шагом, а выход на улицу или спросить друга – тестовым утверждением.

В интеграционном тестировании мы можем протестировать сразу несколько компонентов. Эти компоненты могут быть чем угодно в нашем коде, например функциями, классами и модулями, которые мы написали.

Но есть ограничение на интеграционное тестирование; что делать, если тест не дает ожидаемого результата. В этой ситуации будет очень сложно распознать, какая часть системы не работает. Возьмем предыдущий пример; если свет не загорелся, возможно, разрядился аккумулятор, сломался плафон, неисправен компьютер автомобиля. Вот почему мы рассматриваем модульное тестирование, чтобы точно узнать проблему в тестируемом коде.

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

До сих пор мы видели два типа тестирования: интеграционный тест проверяет несколько компонентов; модульный тест проверяет небольшой компонент в приложении.

Давайте разберемся в следующем примере. Мы применяем встроенную в Python функцию sum() для модульного тестирования на известном выходе. Проверяем, что sum() числа (2, 3, 5) равна 10.

assert sum([ 2, 3, 5]) == 10, "Should be 10"

Вышеупомянутая строка вернет правильный результат, потому что значения верны. Если мы передадим неправильные аргументы, он вернет ошибку утверждения. Например –

assert sum([1, 3, 5]) == 10, "Should be 10"

Traceback (most recent call last):

File "", line 1, in

AssertionError: Should be 10

Мы можем поместить приведенный выше код в файл и снова выполнить его в командной строке.

def test_sum():

assert sum([2, 3, 5]) == 10, "It should be 10"

if __name__ == "__main__":

test_sum()

print("Everything passed")

Выход:

$ python sum.py

Everything is correct

В следующем примере мы передадим кортеж для тестирования. Создадим новый файл с именем test_sum2.py.

Пример – 2:

def test_sum2():

assert sum([2, 3, 5]) == 10, "It should be 10"

def test_sum_tuple():

assert sum((1, 3, 5)) == 10, "It should be 10"

if __name__ == "__main__":

test_sum2()

test_sum_tuple()

print("Everything is correct")

Выход:

Everything is correct

Traceback (most recent call last):

File "", line 13, in

File "", line 9, in test_sum_tuple

AssertionError: It should be 10



Объяснение:

В приведенном выше коде мы передали неверный ввод в test_sum_tuple(). Результат отличается от прогнозируемого.

Вышеупомянутый метод хорош, но что делать, если есть несколько ошибок. Интерпретатор Python немедленно выдаст ошибку при обнаружении первой погрешности. Чтобы устранить эту проблему, воспользуемся тестировщиком – Test Runner.

Приложения Test Runner, специально разработанные для тестирования выходных данных, запуска тестов предоставляют инструменты для исправления и диагностики тестов и приложений.

Выбор тестировщика

Python содержит множество подобных тестировщиков. Самая популярная встроенная библиотека Python называется unittest. Unittest переносится на другие фреймворки. Рассмотрим следующих трех самых популярных тестировщиков:

модульный тест;

nose or nose2;

pytest.

Мы можем выбрать любой из них в соответствии с нашими требованиями. Давайте кратко познакомимся с ними.

2.1Unittest

Unittest встроен в стандартную библиотеку Python начиная с версии 2.1. Самое лучшее в модульном тестировании то, что он включает в себя как среду тестирования, так и средство запуска тестов. Для написания и выполнения кода юнит-тест предъявляет несколько требований.

Код должен быть написан с использованием классов и функций.

Последовательность различных методов утверждения в классе TestCase, кроме встроенных операторов утверждения.

Давайте разберем приведенный пример, используя unittest.

Пример –

import unittest

class TestingSum(unittest.TestCase):

def test_sum(self):

self.assertEqual(sum([2, 3, 5]), 10, "It should be 10")

def test_sum_tuple(self):

self.assertEqual(sum((1, 3, 5)), 10, "It should be 10")

if __name__ == '__main__':

unittest.main()

Выход:

.F

-

FAIL: test_sum_tuple (__main__.TestingSum)

--

Traceback (most recent call last):

File "", line 11, in test_sum_tuple

AssertionError: 9 != 10 : It should be 10

----------------------------------------------------------------------

Ran 2 tests in 0.001s

FAILED (failures=1)

Traceback (most recent call last):

File "", line 14, in

File "/usr/lib/python3.8/unittest/main.py", line 101, in __init__

self.runTests()

File "/usr/lib/python3.8/unittest/main.py", line 273, in runTests

sys.exit(not self.result.wasSuccessful())

SystemExit: True



Как мы видим в выходных данных, dot(.) Указывает на успешное выполнение и F для одного сбоя.

2.2Nose

Иногда нам нужно написать сотни или тысячи тестовых строк для приложения; становится так трудно понять.

Средство запуска тестов nose может быть подходящей заменой средств запуска тестов unittest, поскольку оно совместимо с любыми тестами, написанными с использованием инфраструктуры unittest. Есть два типа теста – nose и nose2. Мы рекомендуем использовать nose2, потому что это последняя версия.

Работая с nose2, нам нужно установить его с помощью следующей команды.

pip install nose2

Выполним следующую команду в терминале, чтобы проверить код с помощью nose2.

python -m nose2

Результат выглядит следующим образом.

FAIL: test_sum_tuple (__main__.TestSum)

--

Traceback (most recent call last):

File "test_sum_unittest.py", line 10, in test_sum_tuple

self.assertEqual(sum((2, 3, 5)), 10, "It should be 10")

AssertionError: It should be 10

--

Ran 2 tests in 0.001s

FAILED (failures=1)

Nose2 предоставляет множество флагов командной строки для фильтрации теста. Вы можете узнать больше из его официальной документации.

Pytest

Средство запуска тестов pytest поддерживает выполнение тестовых случаев unittest. Фактическое преимущество pytest заключается в написании тестовых примеров pytest. Тестовые примеры pytest обычно представляют собой последовательность методов в запуске файла Python.

Pytest предоставляет следующие преимущества:

Поддерживает встроенный оператор assert вместо использования специальных методов assert*().

Он также поддерживает очистку тестовых случаев.

Может повторяться из последних случаев.

Имеет экосистему из сотен плагинов для расширения функциональности.

Пример –

def test_sum():

assert sum([2, 3, 5]) == 10, "It should be 10"

def test_sum_tuple():

assert sum((1, 2, 5)) == 10, "It should be 10"

Написание первого теста

Здесь мы применим все концепции, которые мы узнали в предыдущем разделе. Во-первых, нам нужно создать файл с именем test.py или что-то в этом роде. Затем введем входные данные и выполним тестируемый код, зафиксировав выходные данные. После успешного выполнения кода сопоставим вывод с ожидаемым результатом.

Сначала мы создаем файл my_sum и записываем в него код.

def sum(arg):

total = 0

for val in arg:

total += val

return total

Мы инициализировали общую переменную, которая выполняет итерацию по всем значениям в arg. Теперь мы создаем файл с именем test.py со следующим кодом.

Пример –

import unittest

from my_sum import sum

class CheckSum(unittest.TestCase):

def test_list_int(self):

data = [1, 2, 3]

result = sum(data)

self.assertEqual(result, 6)

if __name__ == '__main__':

unittest.main()

Выход:

.

----------------------------------------------------------------------

Ran 1 test in 0.000s

OK

Объяснение:

В приведенном выше коде мы импортировали sum() из созданного нами пакета my_sum. Мы определили Checkclass, который наследуется от unittest.TestCase. Есть тестовые методы – .test_list_int(), чтобы проверить целое число.

После запуска кода возвращается dot(.), Что означает, что в коде нет ошибки.

Разберемся еще на одном примере.

Пример – 2

class Person:

name1 = []

def set_name(self, user_name):

self.name1.append(user_name)

return len(self.name1) - 1

def get_name(self, user_id):

if user_id >= len(self.name1):

return ' No such user Find'

else:

return self.name1[user_id]

if __name__ == '__main__':

person = Person()

print('Peter Decosta has been added with id ', person.set_name('Peter'))

print('The user associated with id 0 is ', person.get_name(0))

Выход:

Peter Decosta has been added with id 0

The user associated with id 0 is Peter

Базовые функции Python и вывод модульных тестов

Модуль unittest дает три возможных результата. Ниже приведены возможные результаты.

ОК – если все тесты пройдены, возвращается ОК.

Failure – это вызовет исключение AssertionError, если какой-либо из тестов не пройден.

Error – если возникают какие-либо ошибки вместо ошибки утверждения.

Давайте посмотрим на следующие основные функции.

Метод Описание

.assertEqual (а, б) а == б

.assertTrue (x) bool (x) истинно

.assertFalse (x) bool (x) ложно

.assertIs (а, б) а это б

.assertIsNone (x) x нет

.assertIn (а, б) а в б

.assertIsInstance (а, б) isinstance (а, б)

.assertNotIn (а, б) а не в б

.assertNotIsInstance (а, б) не isinstance (а, б)

.assertIsNot (а, б) а не б

Пример

import unittest

# First we import the class which we want to test.

import Person1 as PerClass

class Test(unittest.TestCase):

"""

The basic class that inherits unittest.TestCase

"""

person = PerClass.Person() # instantiate the Person Class

user_id = [] # This variable stores the obtained user_id

user_name = [] # This variable stores the person name

# It is a test case function to check the Person.set_name function

def test_0_set_name(self):

print("Start set_name test\n")

for i in range(4):

# initialize a name

name = 'name' + str(i)

# put the name into the list variable

self.user_name.append(name)

# extraxt the user id obtained from the function

user_id = self.person.set_name(name)

# check if the obtained user id is null or not

self.assertIsNotNone(user_id)

# store the user id to the list

self.user_id.append(user_id)

print("The length of user_id is = ", len(self.user_id))

print(self.user_id)

print("The length of user_name is = ", len(self.user_name))

print(self.user_name)

print("\nFinish set_name test\n")

# Second test case function to check the Person.get_name function

def test_1_get_name(self):

print("\nStart get_name test\n")

# total number of stored user information

length = len(self.user_id)

print("The length of user_id is = ", length)

print("The lenght of user_name is = ", len(self.user_name))

for i in range(6):

# if i not exceed total length then verify the returned name

if i < length:

# if the two name not matches it will fail the test case

self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))

else:

print("Testing for get_name no user test")

# if length exceeds then check the 'no such user' type message

self.assertEqual('There is no such user', self.person.get_name(i))

print("\nFinish get_name test\n")

if __name__ == '__main__':

# begin the unittest.main()

unittest.main()

Выход:

Start set_name test

The length of user_id is = 4

[0, 1, 2, 3]

The length of user_name is = 4

['name0', 'name1', 'name2', 'name3']

Finish set_name test

Start get_name test

The length of user_id is = 4

The lenght of user_name is = 4

Testing for get_name no user test

.F

======================================================================

FAIL: test_1_get_name (__main__.Test)

----------------------------------------------------------------------

Traceback (most recent call last):

File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/multiprocessing.py", line 502, in test_1_get_name

self.assertEqual('There is no such user', self.person.get_name(i))

AssertionError: 'There is no such user' != ' No such user Find'

- There is no such user

+ No such user Find

----------------------------------------------------------------------

Ran 2 tests in 0.002s

FAILED (failures=1)

Сценарий предварительного тестирования

Мы должны следовать определенному сценарию при создании теста для приложения:

Создать необходимый ввод.

Выполнить код, взяв вывод.

Сопоставить вывод с ожидаемым результатом.

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

Создаваемые нами входные данные называются фикстурой. Мы можем повторно использовать фикстуры в нашем приложении.

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

Обработка ожидаемых сбоев

В предыдущем примере мы передаем целое число в test sum(); что произойдет, если мы передадим неверное значение, например одно целое число или строку?

Sum() выдаст ошибку, как и ожидалось. Произойдет это из-за неудачного теста.

Мы можем использовать .assertRaises() для обработки ожидаемых ошибок. Используется внутри с заявлением.

Пример -

import unittest

from my_sum import sum

class CheckSum(unittest.TestCase):

def test_list_int(self):

# Test that it can sum a list of integers

data = [1, 2, 3]

res = sum(data)

self.assertEqual(res, 6)

def test_bad_type(self):

data = "Apple"

with self.assertRaises(TypeError):

res = sum(data)

if __name__ == '__main__':

unittest.main()

Выход:

..

----------------------------------------------------------------------

Ran 2 tests in 0.006s

OK

Пропустить TestCase

Мы можем пропустить отдельный метод тестирования или TestCase, используя технику пропуска теста. Ошибка не будет считаться ошибкой в TestResult.

Рассмотрим следующий пример, как безоговорочно пропустить этот метод.

Пример -

import unittest

def add(x,y):

c = x + y

return c

class SimpleTest(unittest.TestCase):

@unittest.skip("The example skipping method")

def testadd1(self):

self.assertEquals(add(10,5),7)

if __name__ == '__main__':

unittest.main()

Выход:

s

----------------------------------------------------------------------

Ran 1 test in 0.000s

OK (skipped=1)

Объяснение:

В приведенном выше примере метод skip() с префиксом @token. Он принимает один аргумент - сообщение журнала, в котором мы можем описать причину пропуска. Символ s означает, что тест был успешно пропущен.

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

Пример - 2:

import unittest

class suiteTest(unittest.TestCase):

a = 100

b = 40

def test_add(self):

res = self.a + self.b

self.assertEqual(res, 100)

@unittest.skipIf(a > b, "Skip because a is greater than b")

def test_sub(self):

res = self.a - self.b

self.assertTrue(res == -10)

@unittest.skipUnless(b == 0, "Skip because b is eqaul to zero")

def test_div(self):

res = self.a / self.b

self.assertTrue(res == 1)

@unittest.expectedFailure

def test_mul(self):

res = self.a * self.b

self.assertEqual(res == 0)

if __name__ == '__main__':

unittest.main()

Выход:

Fsx.

======================================================================

FAIL: test_add (__main__.suiteTest)

----------------------------------------------------------------------

Traceback (most recent call last):

File "C:/Users/DEVANSH SHARMA/PycharmProjects/Hello/multiprocessing.py", line 539, in test_add

self.assertEqual(res, 100)

AssertionError: 50 != 100

----------------------------------------------------------------------

Ran 4 tests in 0.001s

FAILED (failures=1, skipped=1, expected failures=1)

Объяснение:

Как видно из выходных данных, условия b == 0 и a> b истинны, поэтому метод test_mul() пропустил. С другой стороны, test_mul был отмечен как ожидаемый сбой. Мы обсудили важнейшую концепцию модульного тестирования Python. Как новичку, вам нужно писать умные, удобные в обслуживании методы для проверки кода.

Еще для изучения:

Модуль Википедии на Python - извлечение данных через API

Шифр Цезаря в Python - руководство по шифрованию

Модули Git на Python - примеры использования

Работа с базой данных SQLite в Python - примеры

ОСТАВИТЬ КОММЕНТАРИЙ

ПРИМЕРЫ10 лучших IDE для Python

Опубликовано 08.09.2021

Существуют следующие среды разработки Python:

PyCharm

Spyder

PyDev

Atom

Wing

Jupyter Notebook

Thonny

Rodeo

Microsoft Visual Studio

eric

1   2   3


написать администратору сайта