@@ -108,11 +108,25 @@ def _from_json(cls, reportdict: dict[str, Any]) -> SubtestReport:
108108 return report
109109
110110 @classmethod
111- def _from_test_report (
112- cls , test_report : TestReport , context : SubtestContext
111+ def _new (
112+ cls ,
113+ test_report : TestReport ,
114+ context : SubtestContext ,
115+ captured_output : Captured | None ,
116+ captured_logs : CapturedLogs | None ,
113117 ) -> Self :
114118 result = super ()._from_json (test_report ._to_json ())
115119 result .context = context
120+
121+ if captured_output :
122+ if captured_output .out :
123+ result .sections .append (("Captured stdout call" , captured_output .out ))
124+ if captured_output .err :
125+ result .sections .append (("Captured stderr call" , captured_output .err ))
126+
127+ if captured_logs and (log := captured_logs .handler .stream .getvalue ()):
128+ result .sections .append (("Captured log call" , log ))
129+
116130 return result
117131
118132
@@ -242,17 +256,17 @@ def __exit__(
242256 report = self .ihook .pytest_runtest_makereport (
243257 item = self .request .node , call = call_info
244258 )
245- sub_report = SubtestReport ._from_test_report (
246- report , SubtestContext (msg = self .msg , kwargs = self .kwargs )
259+ sub_report = SubtestReport ._new (
260+ report ,
261+ SubtestContext (msg = self .msg , kwargs = self .kwargs ),
262+ captured_output = self ._captured_output ,
263+ captured_logs = self ._captured_logs ,
247264 )
248265
249266 if sub_report .failed :
250267 failed_subtests = self .config .stash [failed_subtests_key ]
251268 failed_subtests [self .request .node .nodeid ] += 1
252269
253- self ._captured_output .update_report (sub_report )
254- self ._captured_logs .update_report (sub_report )
255-
256270 with self .suspend_capture_ctx ():
257271 self .ihook .pytest_runtest_logreport (report = sub_report )
258272
@@ -299,10 +313,10 @@ def capturing_output(request: SubRequest) -> Iterator[Captured]:
299313@contextmanager
300314def capturing_logs (
301315 request : SubRequest ,
302- ) -> Iterator [CapturedLogs | NullCapturedLogs ]:
316+ ) -> Iterator [CapturedLogs | None ]:
303317 logging_plugin = request .config .pluginmanager .getplugin ("logging-plugin" )
304318 if logging_plugin is None :
305- yield NullCapturedLogs ()
319+ yield None
306320 else :
307321 handler = LogCaptureHandler ()
308322 handler .setFormatter (logging_plugin .formatter )
@@ -317,27 +331,11 @@ class Captured:
317331 out : str = ""
318332 err : str = ""
319333
320- def update_report (self , report : TestReport ) -> None :
321- if self .out :
322- report .sections .append (("Captured stdout call" , self .out ))
323- if self .err :
324- report .sections .append (("Captured stderr call" , self .err ))
325-
326334
327335@dataclasses .dataclass
328336class CapturedLogs :
329337 handler : LogCaptureHandler
330338
331- def update_report (self , report : TestReport ) -> None :
332- captured_log = self .handler .stream .getvalue ()
333- if captured_log :
334- report .sections .append (("Captured log call" , captured_log ))
335-
336-
337- class NullCapturedLogs :
338- def update_report (self , report : TestReport ) -> None :
339- pass
340-
341339
342340def pytest_report_to_serializable (report : TestReport ) -> dict [str , Any ] | None :
343341 if isinstance (report , SubtestReport ):
0 commit comments