为什么py.test将我的xfail测试显示为跳过?

时间:2016-07-26 14:20:50

标签: python unit-testing jenkins pytest

我有一些python代码和一堆pytest测试。

我希望失败的一些测试(也就是说,我正在测试错误处理,所以我传入的输入会导致我的代码抛出异常。)

为了做到这一点,我有这样的代码:

CF_TESTDATA =[('data/1_input.csv', 'data/1_input.csv', 'utf-8'),
              pytest.mark.xfail(('data/1_input_unknown_encoding.txt', '', 'utf-8')),
              ('data/1_input_macintosh.txt', 'data/1_converted_macroman.csv', 'macroman')]
@pytest.mark.parametrize('input_file, expected_output, encoding', CF_TESTDATA)

def test_convert_file(testdir, tmpdir, input_file, expected_output, encoding):
    '''
    Test the function that converts a file to UTF-8.
    '''
...

这里的想法是第二次运行此测试,使用input_file =' data / 1_input_unknown_encoding.txt',我希望测试中的代码失败。

这似乎工作正常,当我从命令行运行时,pytest告诉我测试有xfailed。我可以按照调试器中的代码查看它是否抛出了预期的异常。所以这一切都很好。

但詹金斯正在以skkipped的形式展示这项测试。当我查看输出时,我看到了消息:

Skip Message

expected test failure

为什么测试显示为跳过?似乎测试运行,并且按预期失败。这与被跳过的测试不同。

2 个答案:

答案 0 :(得分:2)

答案是我正在使用xfail错误。它不应该用于期望测试失败。它没有这样做。如果测试失败或未失败,则记录为通过。

我需要做的是改变测试以捕获我期望的异常,如果没有抛出异常则输出错误。然后我将删除xfails。

xfail似乎适用于暂时失败的测试,并且您希望测试套件通过的情况。因此,它并没有预期失败,因为不关心失败。

虽然测试仍在运行,但未检查结果,因此报告显示已跳过此测试是合理的。

我的测试现在看起来像这样:

# Test the run function. 
ex1 = False 
try:
        result = main.run(base_dir + '/'+ input_file, \
                 client_config['properties']) 
except ValueError as e:
        ex1 = True
        print e

if expect_fail:
        assert ex1 
else:
        assert not ex1
        assert filecmp.cmp(result, base_dir + '/' + expected_output), \
            "Ouput file is not the same as the expected file: " + expected_output

答案 1 :(得分:0)

添加答案以解释为什么将ExpectedFail标记为已跳过。

在py.test中,测试状态可以为:

  • 通过或
  • 失败或
  • 已跳过。 xfail(又名ExpectedFailure)是已跳过的子集:

    • 带有@ unittest.skip(“ message”)标签的测试无法运行。
    • 已运行@ unittest.expectedFailure标记的测试,并且:

        如果结果为失败或
      • ,将
      • 已跳过的消息设置为xfail“预期的测试失败”
      • xpass如果结果为通过,则“ xfail标记的测试意外通过”。

参考:

http://doc.pytest.org/en/latest/skipping.html