1
1
import os
2
+ from typing import Dict
2
3
3
4
import pytest
4
5
import tenacity
6
+ from pytest import CollectReport , StashKey
7
+
8
+ # https://docs.pytest.org/en/latest/example/simple.html#making-test-result-information-available-in-fixtures
9
+ phase_report_key = StashKey [Dict [str , CollectReport ]]()
10
+
11
+
12
+ @pytest .hookimpl (tryfirst = True , hookwrapper = True )
13
+ def pytest_runtest_makereport (item , call ):
14
+ # execute all other hooks to obtain the report object
15
+ outcome = yield
16
+ rep = outcome .get_result ()
17
+
18
+ # store test results for each phase of a call, which can
19
+ # be "setup", "call", "teardown"
20
+ item .stash .setdefault (phase_report_key , {})[rep .when ] = rep
5
21
6
22
7
23
@pytest .fixture
@@ -15,18 +31,26 @@ def provider(request):
15
31
16
32
17
33
@tenacity .retry (reraise = True , stop = tenacity .stop_after_attempt (2 ))
18
- def cluster_spawn (provider ):
34
+ def cluster_spawn (provider , keep_servers ):
19
35
provider .init ()
36
+ if not keep_servers :
37
+ provider .destroy ()
20
38
provider .apply ()
21
39
22
40
23
41
@pytest .fixture
24
42
def cluster (request , provider , operating_system ):
43
+ keep_servers = request .config .getoption ("keep_servers" )
44
+ keep_after_fail = request .config .getoption ("keep_servers_after_fail" )
25
45
try :
26
- cluster_spawn (provider )
46
+ cluster_spawn (provider , keep_servers )
27
47
yield provider .cluster ()
28
- if not request .config .getoption ("keep_servers" ):
48
+ report = request .node .stash [phase_report_key ]
49
+ if "call" in report and report ["call" ].failed :
50
+ if not keep_after_fail :
51
+ provider .destroy ()
52
+ elif not keep_servers :
29
53
provider .destroy ()
30
54
except Exception :
31
- if not request . config . getoption ( "keep_servers_after_fail" ) :
55
+ if not keep_after_fail :
32
56
provider .destroy ()
0 commit comments