2024-11-26

自动化测试工具介绍
一、Python 主流自动化测试工具

  1. Selenium
    Selenium 是一个非常流行的自动化测试框架,主要用于 web 应用程序的 UI 自动化。支持多种编程语言,包括 Python。

支持浏览器:Chrome, Firefox, Edge, Safari 等
特点:
支持跨浏览器自动化测试
支持浏览器调试
强大的社区支持和大量教程
可以与其他工具(如 Jenkins)结合使用,支持 CI/CD 流程
安装
bash
pip install selenium
示例代码:

python
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.example.com')
print(driver.title)
driver.quit()
  1. PyTest
    PyTest 是 Python 中广泛使用的单元测试框架,同时也支持 UI 和接口自动化测试。

支持特性:
强大的插件支持(如 pytest-selenium, pytest-html 等)
测试报告自动生成
支持参数化测试
安装
bash
pip install pytest
示例代码:

python
def test_example():
    assert 1 + 1 == 2
  1. Requests
    Requests 是一个简单易用的 HTTP 请求库,主要用于接口自动化测试。

支持特性:
简单的 API
支持各种 HTTP 方法(GET, POST, PUT, DELETE 等)
支持会话和 cookie 管理
安装
bash
pip install requests
示例代码:

python
import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts')
print(response.json())
  1. Appium
    Appium 是一个开源的自动化测试框架,支持移动端(Android 和 iOS)应用程序的 UI 自动化。

支持特性:
跨平台(Android、iOS 和 Windows)
兼容 Selenium WebDriver
支持多种编程语言(包括 Python)
安装
bash
pip install Appium-Python-Client
二、Java 主流自动化测试工具

  1. Selenium
    Selenium 在 Java 中也得到了广泛应用,功能与 Python 版本基本相同。支持多浏览器和多平台的自动化。

支持特性:
支持与 TestNG/JUnit 集成,易于编写和执行测试用例
丰富的 WebDriver API
支持跨浏览器自动化
Maven 安装依赖:

xml
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.0.0</version>
</dependency>
示例代码:
java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class SeleniumTest {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.example.com");
        System.out.println(driver.getTitle());
        driver.quit();
    }
}
  1. TestNG
    TestNG 是 Java 中常用的测试框架,具有强大的功能,支持并发执行、分组、依赖关系、数据驱动测试等。

支持特性:
支持并行执行测试
可以与 Selenium 集成进行自动化测试
强大的报告功能
Maven 安装依赖:

xml
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.4.0</version>
    <scope>test</scope>
</dependency>
示例代码:
java
import org.testng.annotations.Test;

public class TestNGExample {
    @Test
    public void testMethod() {
        System.out.println("This is a TestNG test!");
    }
}
  1. RestAssured
    RestAssured 是一个 Java 库,专门用于 API 测试。它使得编写 REST API 测试变得简单直观。

支持特性:
支持 RESTful API 测试
提供简单的语法来验证响应
支持 JSON 和 XML 格式的数据验证
Maven 安装依赖:

xml
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>5.2.0</version>
    <scope>test</scope>
</dependency>
示例代码:
java
import io.restassured.RestAssured;
import io.restassured.response.Response;

public class RestAssuredTest {
    public static void main(String[] args) {
        Response response = RestAssured.get("https://jsonplaceholder.typicode.com/posts");
        System.out.println(response.getBody().asString());
    }
}

三、UFT(Unified Functional Testing)

  1. UFT(以前称为 QTP)
    UFT 是由 Micro Focus 提供的自动化测试工具,支持 UI 和 API 测试,广泛用于企业级应用程序的自动化测试。

支持特性:
支持桌面和 web 应用的 UI 自动化
支持 API 测试(Web Services, SOAP, REST 等)
强大的对象识别功能,支持多种技术(如 Java, .NET, SAP 等)
集成与 ALM(Application Lifecycle Management)
特点:
回归测试:支持自动化回归测试,方便项目后期更新时确保系统功能不受影响。
关键词驱动测试:UFT 支持通过关键词驱动的方法编写测试脚本,适合非编程人员使用。
跨平台支持:支持多种浏览器、操作系统和移动设备上的自动化。
使用示例:
UFT 中的自动化脚本使用 VBScript 语言编写,示例代码如下:

'打开浏览器并访问网站
Browser("Browser").Navigate "https://www.example.com"

'获取标题
Dim title
title = Browser("Browser").Page("Example").GetROProperty("title")
MsgBox title

总结:
Selenium 是最受欢迎的 Web 自动化工具,支持 Python 和 Java,适用于多种浏览器。
Appium 是一款用于移动端自动化的工具,支持跨平台应用的测试。
Requests 和 RestAssured 是 Python 和 Java 中常用的 API 测试工具,分别适用于接口自动化测试。
TestNG 是 Java 中强大的测试框架,能够与 Selenium 集成进行全面的自动化测试。
UFT 提供了全面的 UI 和 API 测试支持,适用于企业级应用的自动化需求,特别是在与 ALM 集成时表现突出。

UI 和接口自动化框架设计模式及底层逻辑
一、UI 自动化框架设计模式
在 UI 自动化测试中,设计一个结构清晰、易于维护的框架是非常重要的。常见的设计模式主要包括 Page Object Model (POM)、Factory 模式、Singleton 模式 和 Command 模式。下面我们将逐一介绍这些设计模式的作用和底层实现。

  1. Page Object Model (POM) 模式
    Page Object Model (POM) 是 UI 自动化测试中最常用的设计模式之一。它的核心思想是将页面元素和页面操作封装在一个独立的类中,每个页面对应一个类,并通过该类来访问和操作页面元素。

作用:

提高可维护性:当页面发生变化时,只需要修改页面对象类,而不需要修改测试脚本本身。
提高可重用性:页面对象类可以在不同的测试用例中复用。
简化测试脚本:测试脚本只关心业务逻辑,不需要关心页面元素的细节。
底层逻辑:

页面对象类中封装了定位元素的方式(如使用 XPath、CSS Selectors 等)以及操作这些元素的方法(如点击、输入文本、获取文本等)。
测试脚本通过调用这些封装好的方法来与页面交互。
示例:
假设我们有一个登录页面,以下是 Page Object 类的实现:

python
from selenium import webdriver
from selenium.webdriver.common.by import By

class LoginPage:
    def __init__(self, driver: webdriver.Chrome):
        self.driver = driver
        self.username_field = (By.ID, "username")
        self.password_field = (By.ID, "password")
        self.login_button = (By.ID, "loginBtn")

    def enter_username(self, username: str):
        self.driver.find_element(*self.username_field).send_keys(username)

    def enter_password(self, password: str):
        self.driver.find_element(*self.password_field).send_keys(password)

    def click_login(self):
        self.driver.find_element(*self.login_button).click()

    def login(self, username: str, password: str):
        self.enter_username(username)
        self.enter_password(password)
        self.click_login()
  1. Factory 模式
    Factory 模式 用于创建和管理不同类型的对象。在自动化测试中,常用于创建不同浏览器实例的 WebDriver,或者用来创建不同页面对象的实例。

作用:
解耦:测试脚本不需要直接依赖于具体的 WebDriver 实现或页面对象的具体类。
简化代码:通过工厂方法创建和管理对象,而无需在测试中重复写初始化代码。
示例:

python
from selenium import webdriver

class WebDriverFactory:
    @staticmethod
    def get_driver(browser_name: str) -> webdriver.Chrome:
        if browser_name == "chrome":
            return webdriver.Chrome(executable_path="path_to_chromedriver")
        elif browser_name == "firefox":
            return webdriver.Firefox(executable_path="path_to_geckodriver")
        else:
            raise ValueError(f"Browser {browser_name} not supported")

在测试用例中使用工厂方法来创建 WebDriver 实例

driver = WebDriverFactory.get_driver("chrome")

  1. Singleton 模式
    Singleton 模式 是一种确保某个类只有一个实例并提供全局访问点的设计模式。在自动化测试中,通常用于管理 WebDriver 实例,确保在整个测试执行期间只有一个 WebDriver 实例。

作用:
节省资源:避免创建多个 WebDriver 实例,提高测试效率。
全局管理:通过单例模式可以确保 WebDriver 作为单例对象被共享。
示例:

python
from selenium import webdriver

class WebDriverSingleton:
    _driver = None

    @staticmethod
    def get_driver():
        if WebDriverSingleton._driver is None:
            WebDriverSingleton._driver = webdriver.Chrome(executable_path="path_to_chromedriver")
        return WebDriverSingleton._driver

在测试用例中使用单例模式来获取 WebDriver 实例

driver = WebDriverSingleton.get_driver()

  1. Command 模式
    Command 模式 是一种行为型设计模式,能够将请求封装为一个对象,从而允许用户对请求进行参数化处理。它通常用于复杂的 UI 操作,将复杂操作封装为命令对象,并通过执行者执行这些命令。

作用:
解耦请求者和执行者:测试脚本不需要了解执行命令的具体细节,只需要通过执行命令来完成某个操作。
命令队列:可以把多个命令组合在一起,按顺序执行。
示例:

python
class ClickCommand:
    def __init__(self, element):
        self.element = element

    def execute(self):
        self.element.click()

class CommandInvoker:
    def __init__(self):
        self.commands = []

    def add_command(self, command):
        self.commands.append(command)

    def execute_commands(self):
        for command in self.commands:
            command.execute()
# 使用命令模式封装点击操作
button = driver.find_element(By.ID, "submitBtn")
click_command = ClickCommand(button)

invoker = CommandInvoker()
invoker.add_command(click_command)
invoker.execute_commands()

二、接口自动化框架设计模式及底层逻辑
在接口自动化测试中,框架的设计同样非常重要。常用的设计模式包括 数据驱动模式、关键字驱动模式、策略模式 和 RESTful API 模式 等。

  1. 数据驱动测试模式(Data-Driven Testing)
    数据驱动测试模式通过外部数据源(如 Excel、CSV 文件、数据库等)提供测试数据,然后执行相同的测试用例,只是每次使用不同的输入数据进行测试。这种模式可以大大提高测试覆盖率。

作用:
提高测试覆盖率:同一套测试用例可以通过不同的数据执行多次,覆盖更多的场景。
易于扩展:可以非常容易地添加新的测试数据,而不需要修改测试脚本。
底层逻辑:
从数据源读取输入数据。
根据数据驱动执行接口请求,并验证响应数据。
示例:

python
import requests
import csv

def test_api(endpoint, method, params, expected_status):
    if method == "GET":
        response = requests.get(endpoint, params=params)
    elif method == "POST":
        response = requests.post(endpoint, json=params)

    assert response.status_code == expected_status, f"Expected {expected_status}, got {response.status_code}"

# 从 CSV 文件读取测试数据
with open("test_data.csv", mode="r") as file:
    reader = csv.DictReader(file)
    for row in reader:
        test_api(row["endpoint"], row["method"], row["params"], int(row["expected_status"]))
  1. 关键字驱动模式(Keyword-Driven Testing)
    关键字驱动模式通过定义关键字(如 "登录"、"获取数据")来表示接口操作,并将这些关键字与实际的操作方法关联起来。

作用:
非编程人员使用:通过定义简单的关键字,可以让非程序员也能参与到自动化测试的设计中。
便于维护和扩展:通过增加新的关键字,能够方便地扩展框架。
底层逻辑:
将 API 操作抽象为一组关键字,执行时解析关键字,并执行相应的 API 调用。
示例:

python
def perform_action(action, params):
    if action == "login":
        return requests.post("https://example.com/login", json=params)
    elif action == "get_user":
        return requests.get(f"https://example.com/user/{params['user_id']}")

# 执行关键字驱动的测试
test_case = [("login", {"username": "test", "password": "password"}),
             ("get_user", {"user_id": "123"})]

for action, params in test_case:
    response = perform_action(action, params)
    print(response.json())
  1. 策略模式(Strategy Pattern)
    策略模式允许在运行时选择不同的 API 请求策略(如 GET、POST、PUT、DELETE 等)。在接口自动化中,策略模式可以用于根据不同的接口请求类型动态选择请求方式。

作用:
灵活性:可以根据不同的 API 请求类型,选择合适的请求策略进行请求。
可扩展性:可以方便地扩展新的请求策略。
底层逻辑:
定义不同的请求策略,并根据接口的要求动态选择

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 微信公众号-IT赶路人,专注分享与IT相关知识,关注我,一起升职加薪! 下面的Java Selenium问题指南涵...
    IT赶路人阅读 1,051评论 0 1
  • selenium自动化测试基础 1. 使用测试工具1.1 自动化测试理论介绍自动化测试的4W1H自动化测试的典型金...
    思考的山羊阅读 561评论 0 1
  • 洞见SELENIUM自动化测试 写在最前面:目前自动化测试并不属于新鲜的事物,或者说自动化测试的各种方法论已经层出...
    厲铆兄阅读 6,728评论 3 47
  • Selenium 官网Selenium WebDriver官网webdriver实用指南python版本 WebD...
    顾顾314阅读 47,000评论 0 34
  • 第五单元、性能测试 1.什么是性能测试 通过自动化的测试工具模拟系统正常、异常、峰值的场景对系统的各项性能...
    人间朝与暮阅读 249评论 0 0