11import os
22from tempfile import mkdtemp
3+ import allure_commons
34from allure_commons_test .report import AllureReport
45from behave .parser import Parser
56from behave .runner import ModelRunner
67from behave .configuration import Configuration
78from behave .formatter ._registry import make_formatters
89from behave .formatter .base import StreamOpener
9- import threading
10+ import tempfile
11+ from contextlib import contextmanager
1012
1113
1214@given (u'feature definition' )
1315@given (u'feature definition {lang}' )
1416def feature_definition (context , ** kwargs ):
1517 parser = Parser (language = kwargs .get ('lang' , None ))
16- context .feature_definition = parser .parse (context .text )
18+ feature = parser .parse (context .text )
19+ if hasattr (context , "feature_definition" ):
20+ context .feature_definition .append (feature )
21+ else :
22+ context .feature_definition = [feature ]
1723
1824
1925@given (u'hooks implementation' )
@@ -22,26 +28,47 @@ def hooks_implementations(context):
2228 exec (context .text , context .globals )
2329
2430
31+ @given (u'test plan' )
32+ def test_plan_helper (context ):
33+ tmp_dir = os .environ .get ("TEST_TMP" )
34+ file , filename = tempfile .mkstemp (suffix = ".json" , dir = tmp_dir )
35+ os .environ ["ALLURE_TESTPLAN_PATH" ] = filename
36+ with os .fdopen (file , 'w' ) as tmp :
37+ tmp .write (context .text )
38+ context .test_plan = filename
39+
40+
2541@when (u'I run behave with allure formatter' )
2642@when (u'I run behave with allure formatter with options "{args}"' )
2743def run_behave_with_allure (context , ** kwargs ):
28- def run ( context , ** kwargs ):
44+ with test_context ( ):
2945 cmd_args = '-f allure_behave.formatter:AllureFormatter'
3046 cmd = '{options} {cmd}' .format (cmd = cmd_args , options = kwargs .get ('args' , '' ))
3147 config = Configuration (command_args = cmd )
32-
3348 result_tmp_dir = mkdtemp (dir = os .environ .get ('TEST_TMP' , None ))
3449 stream_opener = StreamOpener (filename = result_tmp_dir )
35-
36- model_runner = ModelRunner (config , [context .feature_definition ])
50+ model_runner = ModelRunner (config , context .feature_definition )
3751 model_runner .formatters = make_formatters (config , [stream_opener ])
3852 model_runner .formatters [0 ].listener .fixture_context .enter ()
3953 model_runner .hooks = getattr (context , 'globals' , dict ())
4054 model_runner .run ()
41-
4255 model_runner .formatters [0 ].listener .__del__ ()
4356 context .allure_report = AllureReport (result_tmp_dir )
4457
45- behave_tread = threading .Thread (target = run , args = (context ,), kwargs = kwargs )
46- behave_tread .start ()
47- behave_tread .join ()
58+ os .environ .pop ("ALLURE_TESTPLAN_PATH" , None )
59+
60+
61+ @contextmanager
62+ def test_context ():
63+ def _unregister_plugins ():
64+ plugins = []
65+ for name , plugin in allure_commons .plugin_manager .list_name_plugin ():
66+ allure_commons .plugin_manager .unregister (plugin = plugin , name = name )
67+ plugins .append (plugin )
68+ return plugins
69+
70+ plugins = _unregister_plugins ()
71+ yield
72+ _unregister_plugins ()
73+ for plugin in plugins :
74+ allure_commons .plugin_manager .register (plugin )
0 commit comments