如何在Behave测试的长耗时等待步骤中显示彩色进度条?
解决Behave+Rich进度条在彩色模式下显示异常的问题
问题原因
当Behave启用彩色输出时,它会使用ANSI转义码格式化文本,并且在打印步骤文本后不会立即换行(以便后续更新步骤状态,如标记为通过)。此时Rich进度条开始输出时会直接追加到该步骤行末尾,导致步骤文本与进度条混在一起。而在无彩色模式下,Behave会自动在步骤文本后换行,因此进度条能正常显示在新行。
解决方案
通过以下调整可以同时实现美观的彩色效果和正常的进度条显示:
- 在彩色模式下手动添加换行,将进度条与步骤文本分隔开
- 使用Rich的临时进度条,完成后自动清除,保持输出整洁
- 为进度条添加彩色样式,增强视觉效果并兼容Behave的彩色输出
修改后的步骤实现代码
from rich.progress import Progress, BarColumn, TimeRemainingColumn from rich.console import Console import time def check_if_user_exists_in_iam(cn): # 替换为你的IAM用户存在性检查逻辑 # 示例:模拟检查过程 import random return random.random() < 0.1 # 随机返回True/False,实际需替换为真实检查 @then('Wait for user {cn} to be created in IAM') def step_impl(context, cn): console = Console() # 仅在彩色模式下添加换行,避免进度条与步骤文本重叠 if context.config.color: console.print() total_wait_seconds = 180 # 最长等待3分钟 with Progress( "[bold blue]等待IAM用户创建完成[/bold blue]", BarColumn(bar_width=None, style="cyan", complete_style="green"), TimeRemainingColumn(), transient=True, # 完成后自动清除进度条 console=console ) as progress: task = progress.add_task("", total=total_wait_seconds) user_created = False while not user_created and progress.tasks[task].remaining > 0: user_created = check_if_user_exists_in_iam(cn) if not user_created: time.sleep(1) progress.update(task, advance=1) if not user_created: raise AssertionError(f"用户 '{cn}' 未在{total_wait_seconds//60}分钟内完成创建")
预期输出效果
启用彩色模式时,进度条会显示在步骤文本的下一行,带有彩色样式:
Scenario Outline: Create User -- @1.1 Given Open User Creation Page And Create new user When cn is jdoe And id is 12345 And last name is "Doe" And first name is "John" And middle name is "S" And birth date is "02292004" And cell phone is "800-555-1212" And home email is "user.jdoe@gmail.com" And zip is "78651" Then Create user And Wait for user jdoe to be created in IAM 等待IAM用户创建完成 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:02:45 ✅ Scenario Passed!
进度条完成后会自动消失,最终仅保留步骤和场景通过的提示。
内容的提问来源于stack exchange,提问作者Albert Chin
相关产品推荐
相关产品推荐

