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

- Wiki 界面:测试用例以易于阅读的表格形式写在网页上,业务分析师、开发人员和测试人员都能看懂。
- 可执行:这些表格可以链接到后端的代码(Fixture),从而实现自动化测试。
- 持续集成:FitNesse 可以轻松地集成到 CI/CD 流程中。
为什么选择 Python?
- 语法简洁:Python 代码清晰易读,非常适合编写 Fixture。
- 功能强大:拥有丰富的库(如
requests用于 API 测试,selenium用于 UI 测试),可以覆盖几乎所有测试场景。 - 胶水语言:Python 非常适合连接不同的系统和组件,作为测试脚本的语言再合适不过。
环境准备
在开始之前,请确保您的电脑上已安装以下软件。
a. 安装 Java
FitNesse 是一个 Java 应用程序,所以必须安装 Java 运行时。
- 检查:在终端或命令提示符中运行
java -version。 - 下载:如果未安装,请从 Oracle Java 官网 或 OpenJDK 官网 下载并安装。
b. 安装 Python
- 检查:在终端或命令提示符中运行
python --version或python3 --version。 - 下载:如果未安装,请从 Python 官网 下载并安装。请务必勾选 "Add Python to PATH" 选项。
c. 安装 pip
pip 是 Python 的包管理器,Python 安装时会自带,您可以运行 pip --version 来检查。

d. 安装 FitNesse 服务器
最简单的方式是下载一个独立的 FitNesse JAR 包。
- 访问 FitNesse 的发布页面:https://github.com/unclebob/fitnesse/releases
- 下载最新的
fitnesse.jar文件。 - 在终端中,使用
cd命令切换到您下载fitnesse.jar的目录。
核心概念:FitNesse, Fixture, 和 Python
- FitNesse 页面:这是您在浏览器中看到和编辑的测试用例,它由表格和文本组成。
- Fixture (夹具):这是连接 FitNesse 页面和 Python 代码的桥梁,它是一个 Python 类,FitNesse 会调用这个类的方法来执行测试并验证结果。
- Python Fixture:您用 Python 编写的 Fixture 类,它遵循 FitNesse 的命名和调用约定。
工作流程:
- 在 FitNesse 页面上定义一个测试表格。
- FitNesse 读取表格,解析第一行作为 Fixture 类名。
- FitNesse 启动一个 Python 进程,并告诉它要加载哪个 Fixture 类。
- Python 进程实例化这个 Fixture 类。
- FitNesse 根据表格内容,调用 Fixture 类中的特定方法,并传入表格中的数据。
- Fixture 类执行业务逻辑(如调用 API、操作数据库等)。
- Fixture 类将结果返回给 FitNesse。
- FitNesse 将实际结果与表格中的期望结果进行比较,并显示测试结果(绿色或红色)。
实战演练:第一步 - 最简单的 "Hello World"
让我们从一个最简单的例子开始,验证 Python Fixture 是否能正常工作。
a. 启动 FitNesse 服务器
在存放 fitnesse.jar 的目录下,运行以下命令:

java -jar fitnesse.jar -p 8080
-p 8080指定端口号,可以省略,默认为 8080。
打开浏览器,访问 http://localhost:8080,您应该能看到 FitNesse 的主页。
b. 创建测试页面
- 在首页的 "Where to start?" 输入框中,输入一个新页面的名称,
PythonHelloTest,然后点击 "Go"。 - 您会进入一个新页面,点击 "Edit" 按钮开始编辑。
- 在编辑器中,输入以下内容:
!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 与测试页面
- 回到浏览器中的
PythonHelloTest编辑页面。 - 在顶部添加
!path MyFixtures.py来指定 FitNesse 使用您刚刚创建的 Python 文件。注意:MyFixtures.py和fitnesse.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 实例,设置 left 和 right,然后调用 execute,最后检查 sum 和 product。
高级主题
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 提供的
TestRunner或SlimService,可以将 FitNesse 测试集成到 Jenkins、GitHub Actions 等 CI 工具中,实现自动化执行。
通过本教程,您已经掌握了使用 FitNesse 和 Python 进行自动化测试的基本流程,从最简单的 "Hello World" 到复杂的表格驱动测试,再到高级的 PyFixture,FitNesse 为您提供了一个强大且灵活的平台,让测试变得像写文档一样简单,希望这能帮助您在项目中实践更好的测试策略!
