使用 Pytest 进行单元测试时断言值 None 错误

Sho*_*tor 5 unit-testing pytest python-3.x pandas

一旦测试数据通过测试函数运行,我正在尝试对我的预期数据帧输出与结果数据帧的相等性进行非常简单的断言。但是,我没有比较它们是否相同,而是没有。

我的任何其他使用数据帧的测试都没有这个问题。我也可以打印出预期和结果的数据框,所以我知道它们都存在。最后,我什至可以通过该函数运行完整的生产数据,并按预期输出。

我想我错过了一些东西,但我不确定是什么。除了玩它之外,我还没有真正尝试过任何其他东西。我认为这与数据帧的结构有关。

职能

def get_valid_postal_code(postal_code):
    valid_pc = len(postal_code) == 6 and postal_code[0:5:2].isalpha() and postal_code[1:6:2].isnumeric()
    return valid_pc

def clean_postal_codes(sales):
    sales = sales.dropna(subset=['Postal_Code']).copy()
    sales['Postal_Code'] = sales['Postal_Code'].str.replace(" ", "")
    sales = sales[sales['Postal_Code'].apply(get_valid_postal_code)]
    sales['Postal_Code'] = [x.upper() for x in sales['Postal_Code']]
    return sales
Run Code Online (Sandbox Code Playgroud)

测试功能

def test_clean_postal_codes():
    test_data = pd.DataFrame(
        [[344, 'a0a 0a0', 3000], [344, 'a0a 0a0', -2000], [484, 'A0A 0a0', 1000], [494, 'A0a 0A0', 1000],
         [700, 'A0A0A0', 1000], [900, 'A0A0A0', 1000], [50, 'Not null', 2352], [600, 'asdffa', 23523],
         [634, '3HN3H3', 8839], [32, '3523', 238], [432, 'M5N22H', 2352]],
        columns=['Store_Num', 'Postal_Code', 'Sales']
    )
    expected = pd.DataFrame([[344, 'A0A0A0', 3000], [344, 'A0A0A0', -2000], [484, 'A0A0A0', 1000],
                             [494, 'A0A0A0', 1000], [700, 'A0A0A0', 1000], [900, 'A0A0A0', 1000]],
                            columns=['Store_Num', 'Postal_Code', 'Sales'])

    result = clean_postal_codes(test_data)
    print(expected)  # Is not None
    print(result) # Is also not None 
    assert testing.assert_frame_equal(expected, result) # Getting None
Run Code Online (Sandbox Code Playgroud)

我不断收到以下错误"PytestAssertRewriteWarning: asserting the value None, please use "assert is None"。如果您运行并打印出预期和结果数据帧,您可以看到两个数据帧都存在并且是相同的。尽管如此,错误仍然存​​在。

Via*_*v Z 9

我相信这个错误的发生是因为如果帧相等,函数会pandas.testing.assert_frame_equal返回None;如果它们不相等,它会提高AssertionError. 因此,您实际上是在检查assert None.

所以我认为你应该assert在这里删除操作符并只写

testing.assert_frame_equal(expected, result)
Run Code Online (Sandbox Code Playgroud)

或者写

assert testing.assert_frame_equal(expected, result) is None
Run Code Online (Sandbox Code Playgroud)