为了实现从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 webdriverdef 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 driverdef 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):# 初始化Appiumself.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"))@unpackdef 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平台,还能生成复杂的用户操作,并能够生成详细的测试报告和实现数据驱动测试。这让自动化测试工具更灵活、更强大,同时满足了更多实际测试场景的需求。