From 84c94f735004eaac3d6debd9ddebbd89a2d75f4e Mon Sep 17 00:00:00 2001 From: Sergey Orlov Date: Thu, 21 Nov 2019 15:30:32 +0100 Subject: [PATCH] ipatests: add context manager for declaring part of test as xfail This function provides functionality similar to pytest.mark.xfail but for a block of code instead of the whole test function. This has two benefits: 1) you can mark single line as expectedly failing without suppressing all other errors in the test function 2) you can use conditions which can not be evaluated before the test start. The check is always done in "strict" mode, i.e. if test is expected to fail but succeeds then it will be marked as failing. Reviewed-By: Florence Blanc-Renaud --- ipatests/util.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ipatests/util.py b/ipatests/util.py index 398ed2d6c..24e149daf 100644 --- a/ipatests/util.py +++ b/ipatests/util.py @@ -887,3 +887,28 @@ def get_group_dn(cn): def get_user_dn(uid): return DN(('uid', uid), api.env.container_user, api.env.basedn) + + +@contextmanager +def xfail_context(condition, reason): + """Expect a block of code to fail. + + This function provides functionality similar to pytest.mark.xfail + but for a block of code instead of the whole test function. This has + two benefits: + 1) you can mark single line as expectedly failing without suppressing + all other errors in the test function + 2) you can use conditions which can not be evaluated before the test start. + + The check is always done in "strict" mode, i.e. if test is expected to + fail but succeeds then it will be marked as failing. + """ + try: + yield + except Exception: + if condition: + pytest.xfail(reason) + raise + else: + if condition: + pytest.fail('XPASS(strict) reason: {}'.format(reason), False)