airtest中数据动态花
时间: 2025-05-09 20:08:19 浏览: 17
### Airtest 中的数据驱动与动态参数化
#### 数据驱动的概念
数据驱动是一种软件测试方法,其中测试输入和期望的结果存储在外部文件中(如 Excel 表格、CSV 文件或数据库),而不是硬编码到测试脚本中。这种方法允许通过更改数据集来重复使用相同的测试逻辑[^1]。
#### 动态参数化的实现方式
在 Airtest 中可以利用 Python 的特性以及 Airtest 提供的功能接口完成动态参数化。以下是几种常见的实现方式:
1. **读取 CSV 或 JSON 文件中的数据**
使用标准库 `csv` 或者第三方库 `pandas` 来加载外部数据源并将其传递给测试函数。
2. **循环执行测试用例**
将不同的参数组合放入列表或其他容器结构中,在主程序中遍历这些参数并调用相应的操作。
3. **结合 pytest 参数化功能**
如果您正在使用 pytest 运行您的 Airtest 测试,则可以通过其内置的 parametrize 装饰器轻松实现多组变量注入。
下面给出具体代码示例说明上述三种情况下的应用实例:
#### 实现案例
##### 方法一:从 CSV 文件导入数据
假设我们有一个名为 test_data.csv 的简单逗号分隔值文档如下所示:
```
username,password
admin,root1234
guest,guestpass
user,userpw
```
我们可以这样写我们的登录验证场景:
```python
import csv
from airtest.core.api import *
def login(username, password):
touch(Template(r"login_button.png"))
sleep(2)
text_username = wait(Template(r"textfield_username.png"))
text(text_username, username)
text_password = wait(Template(r"textfield_password.png"))
text(text_password, password)
touch(Template(r"submit_login.png"))
with open('test_data.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
try:
start_app("com.example.app") # 启动目标应用程序
login(row['username'], row['password'])
success_indicator = exists(Template(r"dashboard_welcome_message.png"))
assert success_indicator is not None, f"Login failed with {row}"
finally:
stop_app("com.example.app")
```
##### 方法二:直接定义参数集合并通过迭代访问它们
这里展示了一个更简单的例子,它不依赖任何额外资源而只是单纯列举了几种可能的状态变化.
```python
scenarios = [
{"search_term": "apple", "expected_result_count": 50},
{"search_term": "banana", "expected_result_count": 78}
]
for scenario in scenarios:
start_app("org.wikipedia")
search_box = wait(Template(r"wikipedia_search_icon.png"), timeout=30)
click(search_box)
input_field = wait(Template(r"wikipedia_edit_text.png"), timeout=30)
set_clipboard(scenario["search_term"])
paste(input_field)
results_list = Template(r"wikipedia_results_item_template.png")
actual_count = len(find_all(results_list))
assert abs(actual_count - scenario["expected_result_count"]) / max([actual_count,scenario["expected_result_count"]]) < .1 ,f"Mismatched counts:{actual_count} vs expected {scenario['expected_result_count']}"
keyevent("BACK")
home_screen = wait(Template(r"wikipedia_homepage_logo.png"),timeout=60)
if not home_screen:
raise Exception("Failed to return back to homepage after each run.")
stop_app("org.wikipedia")
```
##### 方法三:集成 PyTest 并运用 Parametrize Decorator
当采用单元测试框架 pytest 执行自动化任务时,可充分利用 @pytest.mark.parametrize 注解简化配置流程.
安装必要的扩展包:`pip install pytest-airtest`.
创建 tests/test_web.py 如下:
```python
@pytest.mark.parametrize(
'browser_name,browser_version',
[('chrome','latest'),('firefox','esr')]
)
def test_browser_compatibility(browser_name,browser_version):
dev = device()
driver = webdriver.Remote(command_executor='http://localhost:4723/wd/hub',
desired_capabilities={
'platformName': 'Android',
'deviceName': '*',
'appPackage': 'com.android.chrome'if browser_name=='chrome'else'mozilla.org/firefox'
})
dev.start_app(driver.capabilities.get('appPackage'))
...
```
以上就是关于如何在 Airtest 中实施数据驱动或者动态参数化的解答[^2].
阅读全文
相关推荐


















