Pytest assertRaisesWithMessage(ValueError) 失败,即使 ValueError



pytest 测试套件在两个测试中失败,即使引发了值错误,我已经打印了以确保条件被激活并且它是,有人知道两个测试失败了吗?

法典

import string
class PhoneNumber:
def __init__(self, number):
self.number = ''.join([el for el in number if el in string.digits])

if len(self.number) <= 9 or len(self.number) > 11:
raise ValueError('Number length is incorrect')
elif len(self.number) == 11:
if self.number.startswith('1'):
self.number = self.number[1::]
if self.number.startswith('0') or self.number.startswith('1'):
print('+++ This fires +++')
raise ValueError('Incorrect area code')
else:
raise ValueError('Number does not start with 1')
elif self.number[0] == '0' or self.number[0] == '1':
raise ValueError('Incorrect area code') 
elif self.number[3] == '0' or self.number[3] == '1':
raise ValueError('Incorrect exchange code')
def area_code(self):
return self.number[:3]

def pretty(self):
return '('+ self.number[:3] +') ' + self.number[3:6] + '-' + self.number[6::]
PhoneNumber("1 (023) 456-7890")

测试

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
PhoneNumber("1 (023) 456-7890")
def test_invalid_if_area_code_starts_with_1_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
PhoneNumber("1 (123) 456-7890")

在测试套件外部运行代码时的输出

+++ This fires +++
Traceback (most recent call last):
File "Exercism/python/phone-number/phone_number.py", line 28, in <module>
PhoneNumber("1 (023) 456-7890")
File "Exercism/python/phone-number/phone_number.py", line 14, in __init__
raise ValueError('Incorrect area code')
ValueError: Incorrect area code

Pytest 输出

=========================================================================== FAILURES =========================================================================== 
_____________________________________ PhoneNumberTest.test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number _____________________________________ 
self = <phone_number_test.PhoneNumberTest testMethod=test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number>
def test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
>           PhoneNumber("1 (223) 056-7890")
E           AssertionError: ValueError not raised
phone_number_test.py:75: AssertionError
_____________________________________ PhoneNumberTest.test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number _____________________________________ 
self = <phone_number_test.PhoneNumberTest testMethod=test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number>
def test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number(self):
with self.assertRaisesWithMessage(ValueError):
>           PhoneNumber("1 (223) 156-7890")
E           AssertionError: ValueError not raised
phone_number_test.py:79: AssertionError
=================================================================== short test summary info ==================================================================== 
FAILED phone_number_test.py::PhoneNumberTest::test_invalid_if_exchange_code_starts_with_0_on_valid_11_digit_number - AssertionError: ValueError not raised       
FAILED phone_number_test.py::PhoneNumberTest::test_invalid_if_exchange_code_starts_with_1_on_valid_11_digit_number - AssertionError: ValueError not raised       
================================================================= 2 failed, 19 passed in 0.78s =================================================================

您正在使用assertRaisesWithMessage,这不是unittest.TestCase中的默认方法,但我假设它需要一条消息,该消息默认为空字符串。由于您不提供消息,因此检查将失败。

如果要使用标准unittest方法,可以使用:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaises(ValueError):
PhoneNumber("1 (023) 456-7890")

或者,如果要测试消息:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with self.assertRaisesRegex(ValueError, "Incorrect area code"):
PhoneNumber("1 (023) 456-7890")

话虽如此,看起来您正在混合unittestpytest。虽然这是可能的,但我建议不要这样做,除了旧的unittest代码。

使用pytest,测试将如下所示:

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with pytest.raises(ValueError):
PhoneNumber("1 (023) 456-7890")

def test_invalid_if_area_code_starts_with_0_on_valid_11_digit_number(self):
with pytest.raises(ValueError, match="Incorrect area code"):
PhoneNumber("1 (023) 456-7890")

您需要从phone_number.py中删除最后一行,在其中实例化无效PhoneNumber。这会导致在测试运行之前发生错误。我假设你把那行留了作为错字?

为清楚起见,它是这一行:

PhoneNumber("1 (023) 456-7890")

您正在测试此行是否无效,但它始终在phone_number.py模块中运行。

相关内容

最新更新