自学内容网 自学内容网

借助AI与LangChain:一键从Excel生成智能化跨平台自动化测试代码!

为了实现从Excel文件中读取手工测试用例,通过LangChain生成Prompt,最终自动生成App自动化测试代码,可以按照以下步骤进行设计和实现。

步骤概览

  1. 从Excel读取手工测试用例
  2. 使用LangChain生成Prompt并解析
  3. 自动生成Appium等框架的自动化测试代码
  4. 集成自动化测试代码到测试框架中

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. 实现整体流程

综合以上步骤,整个工具的工作流程如下:

  1. 从Excel读取测试用例
  2. 通过LangChain生成Prompt
  3. LangChain自动生成Appium的自动化测试代码
  4. 将生成的代码保存到文件中,供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的代码。
  • 操作类型扩展:可以处理更多类型的操作(如滑动、长按、拖拽)。
  • 测试结果报告:结合现有测试框架生成测试报告,如pytestunittest
  • 数据驱动测试:结合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 生成测试报告

为了生成测试报告,可以使用unittestpytest等框架,并集成报告生成库如pytest-html,来生成详细的测试报告。

使用unittestHTMLTestRunner来生成报告:

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


原文地址:https://blog.csdn.net/judahwang/article/details/142786776

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!