Я пытаюсь изучить pytest, и 1 тестовый пример продолжает давать сбой с подробностями, приведенными ниже
#!/usr/bin/python
-- кодировка: utf-8 --
# Я написал pytest в соответствии с #комментариями в файле test_invetory.py. Все тестовые случаи пройдены, но только 1 все еще не работает. может кто-нибудь помочь мне с ответами.
-------Данные файлы: inventory.py------
<>>>
class InsufficientException(Exception):
pass
класс MobileInventory:
def __init__(self, inventory=None):
if inventory is None:
self.balance_inventory = {}
else:
if not isinstance(inventory, dict):
raise TypeError('Input inventory must be a dictionary')
for model in inventory:
if not isinstance(model, str):
raise ValueError('Mobile model name must be a string'
)
if not isinstance(inventory[model], int) \
or inventory[model] < 0:
raise ValueError('No. of mobiles must be a positive integer'
)
self.balance_inventory = inventory
def add_stock(self, new_stock):
if not isinstance(new_stock, dict):
raise TypeError('Input stock must be a dictionary')
for model in new_stock:
if not isinstance(model, str):
raise ValueError('Mobile model name must be a string')
if not isinstance(new_stock[model], int) \
or new_stock[model] < 0:
raise ValueError('No. of mobiles must be a positive integer'
)
if model in self.balance_inventory:
self.balance_inventory[model] += new_stock[model]
else:
self.balance_inventory[model] = new_stock[model]
def sell_stock(self, requested_stock):
if not isinstance(requested_stock, dict):
raise TypeError('Requested stock must be a dictionary')
for model in requested_stock:
if not isinstance(model, str):
raise ValueError('Mobile model name must be a string')
if not isinstance(requested_stock[model], int) \
or requested_stock[model] < 0:
raise ValueError('No. of mobiles must be a positive integer'
)
if model not in self.balance_inventory:
raise InsufficientException('No Stock. New Model Request'
)
if requested_stock[model] > self.balance_inventory[model]:
raise InsufficientException('Insufficient Stock')
self.balance_inventory[model] -= requested_stock[model]
--это файл (test_inventory.py), где я написал код согласно # комментариям ---
импортировать sys
импортировать os
sys.path.append(os.getcwd())
Импортируйте класс MobileInventory и InsufficientException из модуля инвентаризации, используя выражение from proj.inventory import MobileInventory, InsufficientException.
from proj.inventory import MobileInventory, InsufficientException
Импортировать pytest, используя выражение import pytest.
import pytest
Используйте оператор assert для утверждения и для проверки. Например: assert 1 == 1
assert 1 == 1
Определите класс теста pytest 'TestingInventoryCreation'
класс TestingInventoryCreation:
Определите другой тестовый класс pytest 'TestInventoryAddStock', который проверяет поведение метода 'add_stock', со следующими тестами
class TestInventoryAddStock:
Определите другой тестовый класс pytest 'TestInventorySellStock', который проверяет поведение метода 'sell_stock', со следующими тестами
класс TestInventorySellStock:
.test/test_pytest.py::test_source_code[test_tescases1] PASSED [ 4%]
.test/test_pytest.py::test_source_code[test_tescases2] FAILED [ 9%]
.test/test_pytest.py::test_source_code[test_tescases3] PASSED [ 14%]
......
.test/test_pytest.py::test_pytest_testcase_result[test_testcase_result] PASSED [100%]
=================================== FAILURES ===================================
_______________________ test_source_code[test_tescases2] _______________________
inspect_get_sourcecode = " def test_creating_specified_inventory(self):\n i1 = MobileInventory({'iPhone Model X': 100, 'Xiaomi Model ...': 25})\n assert i1.balance_inventory == {'iPhone Model X': 100, 'Xiaomi Model Y': 1000, 'Nokia Model Z': 25}\n"
expected = ['\{\"iPhone\sModel\sX\"\:\s100,[\n\s]\"Xiaomi\sModel\sY\"\:\s1000,[\n\s]\"Nokia\sModel\sZ\"\:. ..odel\sX\"\:\s100,[\n\s]\"Xiaomi\sModel\sY\"\:\s1000,[\n\s]\"Nokia\sModel\sZ\"\:\s25\}\s*==.+)']
@pytest.mark.parametrize("obj, expected",
)
[(test_inventory.TestingInventoryCreation.test_creating_empty_inventory,
[r"MobileInventory()", r"(assert.+==\s*{}|assert\s*{}\s*==.+)"]),
(test_inventory.TestingInventoryCreation.test_creating_specified_inventory,
[
r"{"iPhone\sModel\sX":\s100,[\n\s]"Xiaomi\sModel\sY":\s1000,[\n\s]"Nokia\sModel\sZ":\s25}",
r"(assert. +==\s*{"iPhone\sModel\sX":\s100,[\n\s]"Xiaomi\sModel\sY":\s1000,[\n\s]"Nokia\sModel\sZ": \s25}|assert\s*{"iPhone\sModel\sX":\s100,[\n\s]"Xiaomi\sModel\sY":\s1000,[\n\s]"Nokia\sModel\sZ":\s25}\s*==. +)"
]),
(test_inventory.TestingInventoryCreation.test_creating_inventory_with_list,
[
r"["iPhone\sModel\sX",\s "Xiaomi\sModel\sY",\s "Nokia\sModel\sZ"]",
r "pytest.raises(TypeError",
r"(assert.+==\s*"Input\sinventory\smust\sbe\sa\sdictionary"|assert\s*"Input\sinventory\smust\sbe\sa\sdictionary"\s*==.+)"
]),
(test_inventory.TestingInventoryCreation.test_creating_inventory_with_numeric_keys,
[
r"{1:\s"iPhone\sModel\sX",[\n\s]*2:\s"Xiaomi\sModel\sY",[\n\s]*3:\s"Nokia\sModel\sZ"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"|assert\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"\s*==.+)"
]),
(test_inventory.TestingInventoryCreation.test_creating_inventory_with_nonnumeric_values,
[
r"{"iPhone\sModel\sX":\s"100",[\n\s]"Xiaomi\sModel\sY":\s"1000",[\n\s]"Nokia\sModel\sZ":\s"25"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestingInventoryCreation.test_creating_inventory_with_negative_value,
[
r"{"iPhone\sModel\sX":\s-45,[\n\s]"Xiaomi\sModel\sY":\s200,[\n\s]"Nokia\sModel\sZ":\s25}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestInventoryAddStock.setup_class,
[
r"@classmethod",
r"{"iPhone\sModel\sX":\s100,[\n\s]"Xiaomi\sModel\sY":\s1000,[\n\s]"Nokia\sModel\sZ":\s25}"
]),
(test_inventory.TestInventoryAddStock.test_add_new_stock_as_dict,
[
r "add_stock(",
r"{"iPhone\sModel\sX":\s50,[\n\s]"Xiaomi\sModel\sY":\s2000,[\n\s]"Nokia\sModel\sA":\s10}",
r"(assert. +==\s*{"iPhone\sModel\sX":\s150,[\n\s]"Xiaomi\sModel\sY":\s3000,[\n\s]"Nokia\sModel\sZ":\s25,[\n\s]"Nokia\sModel\sA": \s10}|assert\s{"iPhone\sModel\sX":\s150,[\n\s]"Xiaomi\sModel\sY":\s3000,[\n\s]"Nokia\sModel\sZ":\s25,[\n\s]"Nokia\sModel\sA":\s10}\s==. +)"
]),
(test_inventory.TestInventoryAddStock.test_add_new_stock_as_list,
[
r "add_stock(",
r "pytest.raises(TypeError",
r"["iPhone\sModel\sX",\s "Xiaomi\sModel\sY",\s "Nokia\sModel\sZ"]",
r"(assert.+==\s*"Input\sstock\smust\sbe\sa\sdictionary"|assert\s*"Input\sstock\smust\sbe\sa\sdictionary"\s*==.+)"
]),
(test_inventory.TestInventoryAddStock.test_add_new_stock_with_numeric_keys,
[
r "add_stock(",
r"{1:\s"iPhone\sModel\sA",[\n\s]*2:\s"Xiaomi\sModel\sB",[\n\s]*3:\s"Nokia\sModel\sC"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"|assert\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"\s*==.+)"
]),
(test_inventory.TestInventoryAddStock.test_add_new_stock_with_nonnumeric_values,
[
r "add_stock(",
r"{"iPhone\sModel\sA":\s"50",[\n\s]"Xiaomi\sModel\sB":\s"2000",[\n\s]"Nokia\sModel\sC":\s"25"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestInventoryAddStock.test_add_new_stock_with_float_values,
[
r "add_stock(",
r"{"iPhone\sModel\sA":\s50.5,[\n\s]"Xiaomi\sModel\sB":\s2000.3,[\n\s]"Nokia\sModel\sC":\s25}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestInventorySellStock.setup_class,
[
r"@classmethod",
r"{"iPhone\sModel\sA":\s50,[\n\s]"Xiaomi\sModel\sB":\s2000,[\n\s]"Nokia\sModel\sC":\s10,[\n\s]*"Sony\sModel\sD":\s1}"
]),
(test_inventory.TestInventorySellStock.test_sell_stock_as_dict,
[
r "sell_stock(",
r"{"iPhone\sModel\sA":\s2,[\n\s]"Xiaomi\sModel\sB":\s20,[\n\s]"Sony\sModel\sD":\s1}",
r"(assert. +==\s*{"iPhone\sModel\sA":\s48,[\n\s]"Xiaomi\sModel\sB":\s1980,[\n\s]"Nokia\sModel\sC":\s10,[\n\s]"Sony\sModel\sD": \s0}|assert\s{"iPhone\sModel\sA":\s48,[\n\s]"Xiaomi\sModel\sB":\s1980,[\n\s]"Nokia\sModel\sC":\s10,[\n\s]"Sony\sModel\sD":\s0}\s==. +)"
]),
(test_inventory.TestInventorySellStock.test_sell_stock_as_list,
[
r "sell_stock(",
r "pytest.raises(TypeError",
r"["iPhone\sModel\sA",\s "Xiaomi\sModel\sB",\s "Nokia\sModel\sC"]",
r"(assert.+==\s*"Requested\sstock\smust\sbe\sa\sdictionary"|assert\s*"Requested\sstock\smust\sbe\sa\sdictionary"\s*==.+)"
]),
(test_inventory.TestInventorySellStock.test_sell_stock_with_numeric_keys,
[
r "sell_stock(",
r"{1:\s"iPhone\sModel\sA",[\n\s]*2:\s"Xiaomi\sModel\sB",[\n\s]*3:\s"Nokia\sModel\sC"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"|assert\s*"Mobile\smodel\sname\smust\sbe\sa\sstring"\s*==.+)"
]),
(test_inventory.TestInventorySellStock.test_sell_stock_with_nonnumeric_values,
[
r "sell_stock(",
r"{"iPhone\sModel\sA":\s"2",[\n\s]"Xiaomi\sModel\sB":\s"3",[\n\s]"Nokia\sModel\sC":\s"4"}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestInventorySellStock.test_sell_stock_with_float_values,
[
r "sell_stock(",
r"{"iPhone\sModel\sA":\s2.5,[\n\s]"Xiaomi\sModel\sB":\s3.1,[\n\s]"Nokia\sModel\sC":\s4}",
r "pytest.raises(ValueError",
r"(assert.+==\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"|assert\s*"No.\sof\smobiles\smust\sbe\sa\spositive\sinteger"\s*==.+)"
>
]),
(test_inventory.TestInventorySellStock.test_sell_stock_of_nonexisting_model,
[
r "sell_stock(",
r"{"iPhone\sModel\sB":\s2,[\n\s]*"Xiaomi\sModel\sB":\s5}",
r "pytest.raises(InsufficientException",
r"(assert.+==\s*"No\sStock.\sNew\sModel\sRequest"|assert\s*"No\sStock.\sNew\sModel\sRequest"\s*==.+)"
]),
(test_inventory.TestInventorySellStock.test_sell_stock_of_insufficient_stock,
[
r "sell_stock(",
r"{"iPhone\sModel\sA":\s2,[\n\s]"Xiaomi\sModel\sB":\s5,[\n\s]"Nokia\sModel\sC":\s15}",
r "pytest.raises(InsufficientException",
r"(assert.+==\s*"Insufficient\sStock"|assert\s*"Insufficient\sStock"\s*==.+)"
])
],
ids=['test_tescases1', 'test_tescases2', 'test_tescases3', 'test_tescases4', 'test_tescases5',
<>>>
'test_tescases6', 'test_tescases7', 'test_tescases8', 'test_tescases9', 'test_tescases10',
<>>.
'test_tescases11', 'test_tescases12', 'test_tescases13', 'test_tescases14',
<>>.
"test_tescases15",
'test_tescases16', 'test_tescases17', 'test_tescases18', 'test_tescases19',
<>>.
'test_tescases20'])
def test_source_code(inspect_get_sourcecode, expected):
code = autopep8.fix_code(inspect_get_sourcecode).replace("'", '"')
for exp in expected:
> assert bool(re.search(exp, code)))
E AssertionError
.test/test_pytest.py:163: AssertionError
=========================== краткая информация о тесте ============================
FAILED .test/test_pytest.py::test_source_code[test_tescases2] - AssertionError
========================= 1 не прошел, 20 прошли за 0.47с =========================
Вернуться на верх