为了实现从Excel文件中读取手工测试用例,通过LangChain生成Prompt,最终自动生成App自动化测试代码,可以按照以下步骤进行设计和实现。
步骤概览
- 从Excel读取手工测试用例。
- 使用LangChain生成Prompt并解析。
- 自动生成Appium等框架的自动化测试代码。
- 集成自动化测试代码到测试框架中。
1. 从Excel读取手工测试用例
使用
pandas
库读取Excel文件中的手工测试用例,假设Excel文件结构如下:
用例名称前置条件测试步骤预期结果登录功能测试应用已启动到登录页面1. 输入用户名\n2. 输入密码\n3. 点击登录按钮跳转到主页,登录成功搜索功能测试应用已登录到首页1. 输入搜索关键字\n2. 点击搜索按钮显示搜索结果页面
可以通过以下代码读取并解析Excel文件:
import pandas as pd
# 从Excel文件读取测试用例
def read_test_cases_from_excel(file_path):
df = pd.read_excel(file_path)
test_cases = []
for index, row in df.iterrows():
test_case = {
"用例名称": row["用例名称"],
"前置条件": row["前置条件"],
"测试步骤": row["测试步骤"],
"预期结果": row["预期结果"]
}
test_cases.append(test_case)
return test_cases
2. 使用LangChain生成Prompt并解析
读取Excel中的测试用例后,使用LangChain生成Prompt,将自然语言的测试步骤和预期结果转换为自动化测试代码。
首先,生成Prompt:
# 生成LangChain使用的Prompt
def generate_prompt(test_case):
prompt = f"""
将以下手工测试用例转化为Appium的自动化测试代码:
用例名称: {test_case['用例名称']}
前置条件: {test_case['前置条件']}
测试步骤: {test_case['测试步骤']}
预期结果: {test_case['预期结果']}
"""
return prompt
然后,通过LangChain模型对Prompt进行处理,生成相应的自动化测试代码。
使用LangChain时,可以将Prompt传递给预训练模型或自定义模型,输出自动化测试代码。
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
# 使用LangChain处理Prompt并生成自动化测试代码
def generate_automation_code(prompt):
# 使用LangChain调用 OpenAI 模型 (这里你可以选择不同的模型)
llm = OpenAI(temperature=0)
response = llm(prompt)
return response
3. 自动生成Appium自动化测试代码
解析手工测试用例后,生成具体的Appium代码,例如在Python中:
# 自动生成的Appium代码示例
def generate_appium_test_code(test_case):
prompt = generate_prompt(test_case)
code = generate_automation_code(prompt)
return code
生成的代码可以包括如下内容:
from appium import webdriver
def init_driver():
desired_caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"appPackage": "com.example.app",
"appActivity": ".LoginActivity"
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
return driver
def login_test(driver):
username_input = driver.find_element_by_id("com.example.app:id/username")
username_input.send_keys("有效的用户名")
password_input = driver.find_element_by_id("com.example.app:id/password")
password_input.send_keys("有效的密码")
login_button = driver.find_element_by_id("com.example.app:id/login_button")
login_button.click()
home_page = driver.find_element_by_id("com.example.app:id/home_page")
assert home_page.is_displayed()
if __name__ == "__main__":
driver = init_driver()
login_test(driver)
driver.quit()
4. 自动化测试代码集成
生成的Appium自动化测试代码可以自动集成到项目的测试框架中。你可以通过以下方式将生成的代码写入Python文件,供持续集成工具使用。
# 将生成的测试代码写入文件
def write_code_to_file(code, file_name):
with open(file_name, "w", encoding="utf-8") as f:
f.write(code)
# 示例
test_case = {
"用例名称": "登录功能测试",
"前置条件": "应用已启动到登录页面",
"测试步骤": "1. 输入有效的用户名\n2. 输入有效的密码\n3. 点击登录按钮",
"预期结果": "用户成功登录,跳转到主页"
}
code = generate_appium_test_code(test_case)
write_code_to_file(code, "test_login.py")
5. 实现整体流程
综合以上步骤,整个工具的工作流程如下:
- 从Excel读取测试用例。
- 通过LangChain生成Prompt。
- LangChain自动生成Appium的自动化测试代码。
- 将生成的代码保存到文件中,供CI系统执行。
最终,工具可以通过以下方式运行:
# 主程序:从Excel读取测试用例,生成自动化代码并保存到文件
def main():
file_path = "test_cases.xlsx"
test_cases = read_test_cases_from_excel(file_path)
for i, test_case in enumerate(test_cases):
code = generate_appium_test_code(test_case)
file_name = f"test_case_{i+1}.py"
write_code_to_file(code, file_name)
if __name__ == "__main__":
main()
6. 进一步扩展
- 支持多平台:可以根据
platformName
字段动态生成iOS和Android的代码。 - 操作类型扩展:可以处理更多类型的操作(如滑动、长按、拖拽)。
- 测试结果报告:结合现有测试框架生成测试报告,如
pytest
或unittest
。 - 数据驱动测试:结合Excel的多行数据生成数据驱动测试用例。
通过这些步骤,手工测试用例从Excel中读取后,可以使用LangChain生成Prompt并自动生成Appium等测试框架的自动化代码,实现从手工用例到自动化测试的全流程工具
第6点的扩展是实现更高级的功能,包括多平台支持、操作类型扩展、生成测试报告和数据驱动测试用例。这将使工具更具灵活性和可扩展性。以下是每个功能的详细扩展实现。
6.1 支持多平台 (iOS 和 Android)
为了支持多平台(iOS 和 Android),我们可以在生成自动化测试代码时根据平台名称动态配置。
desired_capabilities
中的
platformName
字段将决定是否生成Android或iOS的代码。
from appium import webdriver
# 初始化驱动器,根据平台生成不同的desired_capabilities
def init_driver(platform):
if platform.lower() == "android":
desired_caps = {
"platformName": "Android",
"deviceName": "emulator-5554",
"appPackage": "com.example.app",
"appActivity": ".LoginActivity"
}
elif platform.lower() == "ios":
desired_caps = {
"platformName": "iOS",
"deviceName": "iPhone Simulator",
"app": "/path/to/your.app",
"platformVersion": "14.5",
"automationName": "XCUITest"
}
else:
raise ValueError(f"Unsupported platform: {platform}")
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
return driver
# 示例调用
driver = init_driver("android")
6.2 扩展操作类型(如滑动、长按、拖拽等)
在测试中,除了常见的输入和点击操作外,滑动、长按、拖拽等高级操作也是必需的。Appium中支持这些手势操作。
from appium.webdriver.common.touch_action import TouchAction
# 生成滑动操作的函数
def swipe_action(driver, start_x, start_y, end_x, end_y, duration=800):
action = TouchAction(driver)
action.press(x=start_x, y=start_y).wait(ms=duration).move_to(x=end_x, y=end_y).release().perform()
# 长按操作
def long_press_action(driver, element, duration=2000):
action = TouchAction(driver)
action.long_press(el=element, duration=duration).release().perform()
# 拖拽操作
def drag_and_drop_action(driver, source_element, target_element):
action = TouchAction(driver)
action.long_press(source_element).move_to(target_element).release().perform()
# 示例调用
element = driver.find_element_by_id("com.example.app:id/element")
long_press_action(driver, element)
6.3 生成测试报告
为了生成测试报告,可以使用
unittest
或
pytest
等框架,并集成报告生成库如
pytest-html
,来生成详细的测试报告。
使用
unittest
和
HTMLTestRunner
来生成报告:
import unittest
from appium import webdriver
from HTMLTestRunner import HTMLTestRunner # HTMLTestRunner可生成HTML测试报告
class AppiumTest(unittest.TestCase):
def setUp(self):
# 初始化Appium
self.driver = init_driver("android")
def test_login(self):
driver = self.driver
# 这里是登录测试的逻辑
username_input = driver.find_element_by_id("com.example.app:id/username")
username_input.send_keys("有效的用户名")
password_input = driver.find_element_by_id("com.example.app:id/password")
password_input.send_keys("有效的密码")
login_button = driver.find_element_by_id("com.example.app:id/login_button")
login_button.click()
# 断言主页是否显示
home_page = driver.find_element_by_id("com.example.app:id/home_page")
self.assertTrue(home_page.is_displayed())
def tearDown(self):
self.driver.quit()
# 运行并生成HTML报告
if __name__ == "__main__":
suite = unittest.TestLoader().loadTestsFromTestCase(AppiumTest)
with open("report.html", "w") as f:
runner = HTMLTestRunner(stream=f, title="Appium Test Report", description="Sample test report")
runner.run(suite)
通过这种方式,测试完成后会生成一个
report.html
文件,里面包含详细的测试步骤和结果。
6.4 数据驱动测试
数据驱动测试可以通过从Excel或其他外部数据源中读取测试数据,动态执行多次测试。可以使用
ddt
库来实现数据驱动测试。
import unittest
from ddt import ddt, data, unpack
import pandas as pd
# 从Excel中读取数据
def get_test_data_from_excel(file_path):
df = pd.read_excel(file_path)
data_list = df.values.tolist() # 转换为列表
return data_list
# 使用ddt实现数据驱动测试
@ddt
class AppiumTest(unittest.TestCase):
def setUp(self):
self.driver = init_driver("android")
# 使用ddt库实现数据驱动测试
@data(*get_test_data_from_excel("test_data.xlsx"))
@unpack
def test_login(self, username, password, expected):
driver = self.driver
# 执行输入和点击操作
username_input = driver.find_element_by_id("com.example.app:id/username")
username_input.send_keys(username)
password_input = driver.find_element_by_id("com.example.app:id/password")
password_input.send_keys(password)
login_button = driver.find_element_by_id("com.example.app:id/login_button")
login_button.click()
# 检查结果
home_page = driver.find_element_by_id("com.example.app:id/home_page")
if expected == "success":
self.assertTrue(home_page.is_displayed())
else:
error_message = driver.find_element_by_id("com.example.app:id/error_message")
self.assertTrue(error_message.is_displayed())
def tearDown(self):
self.driver.quit()
# 运行测试
if __name__ == "__main__":
unittest.main()
6.5 自动化生成代码流程
将前面的扩展功能集成到主流程中,自动生成代码时可以根据输入决定生成哪些操作类型,并支持多平台测试。
# 自动生成的Appium代码示例,支持多平台和扩展操作
def generate_appium_test_code(test_case, platform="android"):
prompt = generate_prompt(test_case)
code = generate_automation_code(prompt)
# 插入平台相关代码
if platform.lower() == "android":
code = code.replace("init_driver()", "init_driver('android')")
elif platform.lower() == "ios":
code = code.replace("init_driver()", "init_driver('ios')")
return code
6.6 完整的自动化工具流程
def main():
# 从Excel读取测试用例
file_path = "test_cases.xlsx"
test_cases = read_test_cases_from_excel(file_path)
# 生成自动化代码并保存到文件
for i, test_case in enumerate(test_cases):
code = generate_appium_test_code(test_case, platform="android")
file_name = f"test_case_{i+1}.py"
write_code_to_file(code, file_name)
# 可选: 集成到CI/CD中运行测试并生成报告
总结
通过这些扩展,工具不仅能支持Android和iOS平台,还能生成复杂的用户操作,并能够生成详细的测试报告和实现数据驱动测试。这让自动化测试工具更灵活、更强大,同时满足了更多实际测试场景的需求。
版权归原作者 jardonwang1 所有, 如有侵权,请联系我们删除。