杰瑞科技汇

Fitnesse Python教程怎么用?

目录

  1. 什么是 FitNesse?为什么选择 Python?
  2. 环境准备
    • 安装 Java
    • 安装 Python
    • 安装 pip
    • 安装 FitNesse 服务器
  3. 核心概念:FitNesse, Fixture, 和 Python
  4. 实战演练:第一步 - 最简单的 "Hello World"
    • 创建测试页面
    • 编写 Python Fixture
    • 关联 Fixture 与测试页面
    • 执行测试
  5. 实战演练:第二步 - 表格驱动测试
    • 使用 DoFixture 进行方法调用
    • 使用 ColumnFixture 进行数据验证
    • 使用 ScriptTable 进行流程控制
  6. 高级主题
    • 处理复杂的数据结构(如列表、字典)
    • 使用 PyFixture 进行更灵活的交互
    • 参数化测试
  7. 最佳实践与总结

什么是 FitNesse?为什么选择 Python?

FitNesse 是一个基于 Wiki 的 Web 服务器,主要用于软件测试和文档,它的核心理念是“可测试的文档”和“可执行的文档”。

Fitnesse Python教程怎么用?-图1
(图片来源网络,侵删)
  • Wiki 界面:测试用例以易于阅读的表格形式写在网页上,业务分析师、开发人员和测试人员都能看懂。
  • 可执行:这些表格可以链接到后端的代码(Fixture),从而实现自动化测试。
  • 持续集成:FitNesse 可以轻松地集成到 CI/CD 流程中。

为什么选择 Python?

  • 语法简洁:Python 代码清晰易读,非常适合编写 Fixture。
  • 功能强大:拥有丰富的库(如 requests 用于 API 测试,selenium 用于 UI 测试),可以覆盖几乎所有测试场景。
  • 胶水语言:Python 非常适合连接不同的系统和组件,作为测试脚本的语言再合适不过。

环境准备

在开始之前,请确保您的电脑上已安装以下软件。

a. 安装 Java

FitNesse 是一个 Java 应用程序,所以必须安装 Java 运行时。

b. 安装 Python

  • 检查:在终端或命令提示符中运行 python --versionpython3 --version
  • 下载:如果未安装,请从 Python 官网 下载并安装。请务必勾选 "Add Python to PATH" 选项

c. 安装 pip

pip 是 Python 的包管理器,Python 安装时会自带,您可以运行 pip --version 来检查。

Fitnesse Python教程怎么用?-图2
(图片来源网络,侵删)

d. 安装 FitNesse 服务器

最简单的方式是下载一个独立的 FitNesse JAR 包。

  1. 访问 FitNesse 的发布页面:https://github.com/unclebob/fitnesse/releases
  2. 下载最新的 fitnesse.jar 文件。
  3. 在终端中,使用 cd 命令切换到您下载 fitnesse.jar 的目录。

核心概念:FitNesse, Fixture, 和 Python

  • FitNesse 页面:这是您在浏览器中看到和编辑的测试用例,它由表格和文本组成。
  • Fixture (夹具):这是连接 FitNesse 页面和 Python 代码的桥梁,它是一个 Python 类,FitNesse 会调用这个类的方法来执行测试并验证结果。
  • Python Fixture:您用 Python 编写的 Fixture 类,它遵循 FitNesse 的命名和调用约定。

工作流程

  1. 在 FitNesse 页面上定义一个测试表格。
  2. FitNesse 读取表格,解析第一行作为 Fixture 类名。
  3. FitNesse 启动一个 Python 进程,并告诉它要加载哪个 Fixture 类。
  4. Python 进程实例化这个 Fixture 类。
  5. FitNesse 根据表格内容,调用 Fixture 类中的特定方法,并传入表格中的数据。
  6. Fixture 类执行业务逻辑(如调用 API、操作数据库等)。
  7. Fixture 类将结果返回给 FitNesse。
  8. FitNesse 将实际结果与表格中的期望结果进行比较,并显示测试结果(绿色或红色)。

实战演练:第一步 - 最简单的 "Hello World"

让我们从一个最简单的例子开始,验证 Python Fixture 是否能正常工作。

a. 启动 FitNesse 服务器

在存放 fitnesse.jar 的目录下,运行以下命令:

Fitnesse Python教程怎么用?-图3
(图片来源网络,侵删)
java -jar fitnesse.jar -p 8080
  • -p 8080 指定端口号,可以省略,默认为 8080。

打开浏览器,访问 http://localhost:8080,您应该能看到 FitNesse 的主页。

b. 创建测试页面

  1. 在首页的 "Where to start?" 输入框中,输入一个新页面的名称,PythonHelloTest,然后点击 "Go"。
  2. 您会进入一个新页面,点击 "Edit" 按钮开始编辑。
  3. 在编辑器中,输入以下内容:
!path ../ (如果您的 fixture 在其他目录,请指定路径)
!|PythonHelloFixture|
|greeting?|
|Hello, Python!|
  • !path ../:这是一个指令,告诉 FitNesse 到哪里去查找 Python 模块,这里我们假设 Fixture 和 fitnesse.jar 在同一级目录,所以用 指向上一级,如果您的 fixture 和 JAR 在同一个目录,可以省略此行。
  • !|PythonHelloFixture|:定义了一个表格,并指定了使用的 Fixture 类名是 PythonHelloFixture
  • |greeting?|:这是表格的列头。 表示这是一个查询方法,FitNesse 会调用 greeting 方法,并期望它返回一个值。
  • |Hello, Python!|:这是期望的结果。

c. 编写 Python Fixture

在与 fitnesse.jar 同级的目录下,创建一个名为 MyFixtures.py 的文件,并写入以下代码:

# MyFixtures.py
class PythonHelloFixture:
    def greeting(self):
        return "Hello, Python!"
  • 类名必须与 FitNesse 页面中指定的完全一致(包括大小写)。
  • 方法的名称 greeting 必须与表格中的列名 greeting? 去掉问号后一致。

d. 关联 Fixture 与测试页面

  1. 回到浏览器中的 PythonHelloTest 编辑页面。
  2. 在顶部添加 !path MyFixtures.py 来指定 FitNesse 使用您刚刚创建的 Python 文件。注意MyFixtures.pyfitnesse.jar 在同一目录,!path 后面直接跟文件名即可。 应该是这样的:
!path MyFixtures.py
!|PythonHelloFixture|
|greeting?|
|Hello, Python!|

点击 "Save" 保存页面。

e. 执行测试

保存后,点击页面上的 "Test" 按钮。

  • 如果一切正常,整个表格应该会变成绿色,表示测试通过。
  • 如果出现红色,说明有错误,检查 Java、Python 环境是否正确,!path 是否正确,以及 Python 代码是否有语法错误。

实战演练:第二步 - 表格驱动测试

让我们来做一些更有意义的测试,假设我们要测试一个简单的计算器。

a. 使用 ColumnFixture 进行数据验证

ColumnFixture 适用于多输入、多输出的场景,每一行代表一次独立的测试。

Python Fixture (MyFixtures.py)

# MyFixtures.py
class CalculatorFixture:
    def __init__(self):
        self.left = 0
        self.right = 0
        self.sum = 0
        self.product = 0
    def result(self):
        # FitNesse 会自动调用这个方法来获取所有标记为输出的属性
        return [self.sum, self.product]
    def execute(self):
        # 这个方法会被 FitNesse 调用,执行计算逻辑
        self.sum = self.left + self.right
        self.product = self.left * self.right
  • FitNesse 会自动查找以 set_ 开头的方法来设置输入值(如 set_left),或者直接赋值给同名属性(self.left)。
  • FitNesse 会自动查找以 get_ 开头的方法或直接访问属性来获取输出值(如 self.sum)。
  • execute 方法是一个特殊的约定,FitNesse 会在设置完所有输入后调用它。

FitNesse 页面 (CalculatorAddAndMultiplyTest)

创建一个新页面 CalculatorAddAndMultiplyTest如下:

!path MyFixtures.py
!|script|
|scenario|add and multiply|
|given|a calculator|
|when|I enter |left| and |right|
|and|I press add and multiply|
|then|the sum should be |expected sum|
|and|the product should be |expected product|
|note|this is a script table, more readable|
|add and multiply|10|5|15|50|
|add and multiply|2|3|5|6|
|add and multiply|-1|7|6|-7|
  • 这是一个 ScriptTable,语法更接近自然语言,可读性更强。
  • scenario 定义了一个测试场景。
  • given, when, then 是步骤。
  • |add and multiply|... 是具体的测试数据行,每一行都会调用一次场景。

另一种更简单的 ColumnFixture 写法:

!path MyFixtures.py
!|CalculatorFixture|
|left|right|sum?|product?|
|10|5|15|50|
|2|3|5|6|
|-1|7|6|-7|

这种写法更直接, 表示该列是输出,FitNesse 会自动为每一行创建一个 CalculatorFixture 实例,设置 leftright,然后调用 execute,最后检查 sumproduct


高级主题

a. 处理复杂的数据结构

如果需要测试返回列表或字典的 API,可以这样写:

Python Fixture (MyFixtures.py)

# MyFixtures.py
import json
class ApiFixture:
    def get_user_info(self, user_id):
        # 模拟一个 API 调用
        if user_id == "123":
            return {"name": "Alice", "email": "alice@example.com", "roles": ["admin", "editor"]}
        return None
    def get_user_info_as_json(self, user_id):
        # 返回 JSON 字符串,方便 FitNesse 解析
        data = self.get_user_info(user_id)
        if data:
            return json.dumps(data)
        return ""

FitNesse 页面 (ApiTest)

!path MyFixtures.py
!|script|
|check|get user info as json|user_id=123|{"name": "Alice", "email": "alice@example.com", "roles": ["admin", "editor"]}|
|note|检查列表中的一个元素|
|check|get user info|user_id=123|name?|Alice|
|check|get user info|user_id=123|roles[0]?|admin|

b. 使用 PyFixture 进行更灵活的交互

PyFixture 是一个非常强大的 Fixture,它允许您在 FitNesse 页面中直接调用 Python 对象的任何方法,而无需为每个方法创建专门的列。

Python Fixture (MyFixtures.py)

# MyFixtures.py
import math
class PyFixture:
    def __init__(self):
        self.math = math  # 将 math 模块暴露出来

FitNesse 页面 (PyFixtureTest)

!path MyFixtures.py
!|PyFixture|
|command|result?|
|math.sqrt(16)||
|math.pow(2, 8)||
|math.pi||
  • command 列可以执行任何有效的 Python 表达式。
  • result? 列会捕获表达式的返回值。

最佳实践与总结

  • 保持 Fixture 简单:Fixture 应该只负责测试逻辑,不要包含复杂的业务逻辑,业务逻辑应该放在被测试的应用程序中。
  • 命名清晰:页面名、Fixture 类名、方法名都应该清晰易懂,反映其测试意图。
  • 分层设计:可以将 Fixture 分为不同层次,
    • Service Fixture:直接调用业务服务。
    • Database Fixture:用于准备和清理测试数据。
    • UI Fixture:使用 Selenium 等工具操作页面。
  • 版本控制:将 FitNesse 页面(.content 文件)和 Python Fixture 代码都纳入版本控制系统(如 Git)。
  • 集成到 CI:使用 FitNesse 提供的 TestRunnerSlimService,可以将 FitNesse 测试集成到 Jenkins、GitHub Actions 等 CI 工具中,实现自动化执行。

通过本教程,您已经掌握了使用 FitNesse 和 Python 进行自动化测试的基本流程,从最简单的 "Hello World" 到复杂的表格驱动测试,再到高级的 PyFixture,FitNesse 为您提供了一个强大且灵活的平台,让测试变得像写文档一样简单,希望这能帮助您在项目中实践更好的测试策略!

分享:
扫描分享到社交APP
上一篇
下一篇