编程中的固定装置是啥?
Posted
技术标签:
【中文标题】编程中的固定装置是啥?【英文标题】:What are fixtures in programming?编程中的固定装置是什么? 【发布时间】:2012-08-17 18:31:02 【问题描述】:我多次听说过这个术语(在编程环境中),但找不到任何解释它的含义。有什么好的文章或解释吗?
【问题讨论】:
【参考方案1】:我想你指的是test fixtures:
测试夹具的目的是确保有一个众所周知的 和运行测试的固定环境,以便结果 可重复的。有些人称之为测试上下文。
夹具示例:
使用特定的已知数据集加载数据库 擦除硬盘并安装已知干净的操作系统安装 复制一组特定的已知文件 输入数据的准备和假或模拟对象的设置/创建
(来源:***,见上面的链接)
这里还有一些practical examples from the documentation of the 'Google Test' framework。
【讨论】:
【参考方案2】:我认为 php 单元测试对此有很好的解释:
编写测试最耗时的部分之一是编写 将世界设置为已知状态的代码,然后将其返回到它的 测试完成时的原始状态。这种已知状态称为 测试的夹具。
Yii 文档也描述了夹具测试的良好状态:
自动化测试需要多次执行。为确保测试 过程是可重复的,我们想在一些已知的 状态称为夹具。例如,测试帖子创建功能 在博客应用程序中,每次我们运行测试时,表 存储有关帖子的相关数据(例如帖子表、评论 table) 应该恢复到某个固定状态。
这里是夹具测试的简单示例
<?php
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
protected $stack;
protected function setUp()
$this->stack = [];
protected function tearDown()
$this->stack = [];
public function testEmpty()
$this->assertTrue(empty($this->stack));
public function testPush()
array_push($this->stack, 'foo');
$this->assertEquals('foo', $this->stack[count($this->stack)-1]);
$this->assertFalse(empty($this->stack));
public function testPop()
array_push($this->stack, 'foo');
$this->assertEquals('foo', array_pop($this->stack));
$this->assertTrue(empty($this->stack));
?>
此 PHP 单元测试具有名称为 setUp
和 tearDown
的函数,在运行测试之前您可以设置数据,完成后您可以将它们恢复到初始状态。
【讨论】:
【参考方案3】:fixture 一词因上下文、编程语言或框架而异。
1.运行测试的已知状态
编写测试最耗时的部分之一是编写 将世界设置为已知状态的代码,然后将其返回到它的 测试完成时的原始状态。这种已知状态称为 测试的夹具。 PHP-Unit documentation
测试夹具(也称为测试上下文)是一组 运行测试所需的先决条件或状态。开发者应该设置 在测试前达到已知的良好状态,并恢复到原来的状态 测试后的状态。 Wikipedia (xUnit)
2。包含样本数据的文件
Fixtures 是样本数据的一个花哨的词。夹具允许您 在测试之前使用预定义的数据填充测试数据库 跑步。 Fixtures 独立于数据库并用 YAML 编写。有 每个模型一个文件。 RubyOnRails.org
3。设置所需状态的过程。
软件测试夹具通过以下方式为测试过程设置系统 为它提供所有必要的代码来初始化它,从而 满足可能存在的任何先决条件。一个例子可能是 从客户站点加载具有已知参数的数据库 在运行测试之前。 Wikipedia
【讨论】:
【参考方案4】:正是针对该主题,JUnit 有一个很好解释的文档。 Here是链接!
文章的相关部分是:
测试需要在一组已知对象的背景下运行。这组对象称为测试夹具。当您编写测试时,您通常会发现与实际测试值相比,您花费更多时间编写代码来设置夹具。
在某种程度上,您可以通过仔细注意您编写的构造函数来更轻松地编写夹具代码。然而,更大的节省来自共享夹具代码。通常,您将能够为多个不同的测试使用相同的夹具。每种情况都会向夹具发送略有不同的消息或参数,并会检查不同的结果。
当你有一个共同的固定装置时,你可以这样做:
为夹具的每个部分添加一个字段 使用 @org.junit.Before 注释方法并初始化该方法中的变量 使用 @org.junit.After 注释方法以释放您在 setUp 中分配的任何永久资源 例如,要编写几个想要使用 12 瑞士法郎、14 瑞士法郎和 28 美元的不同组合的测试用例,首先创建一个夹具:
public class MoneyTest
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
@Before public void setUp()
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
【讨论】:
【参考方案5】:在 Xamarin.UITest 中解释如下:
通常,每个 Xamarin.UITest 都编写为引用的方法 以作为测试。包含测试的类称为测试 夹具。测试夹具包含单个测试或逻辑 测试分组并负责进行测试的任何设置 运行以及测试完成时需要执行的任何清理。 每个测试都应该遵循 Arrange-Act-Assert 模式:
安排 - 测试将设置条件并初始化事物,以便可以执行测试。 Act – 测试将与应用程序交互、输入文本、按下按钮等。 Assert – 测试检查在 Act 步骤中执行的操作的结果以确定正确性。例如, 应用程序可以验证特定的错误消息是 显示。
Link for original article of the above Excerpt
在 Xamarin.UITest 代码中如下所示:
using System;
using System.IO;
using System.Linq;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;
namespace xamarin_stembureau_poc_tests
[TestFixture(Platform.android)]
[TestFixture(Platform.ios)]
public class TestLaunchScreen
IApp app;
Platform platform;
public Tests(Platform platform)
this.platform = platform;
[SetUp]
public void BeforeEachTest()
app = AppInitializer.StartApp(platform);
[Test]
public void AppLaunches()
app.Screenshot("First screen.");
[Test]
public void LaunchScreenAnimationWorks()
app.Screenshot("Launch screen animation works.");
希望这可能对寻求更好地了解编程中的夹具的人有所帮助。
【讨论】:
【参考方案6】:我正在写这个答案,作为我自己关于什么是“夹具”的快速说明。
same-data-multiple-tests
测试夹具:对多个测试使用相同的数据配置 如果您发现自己编写了两个或多个对相似数据进行操作的测试,则可以使用测试夹具。这允许您为多个不同的测试重用相同的对象配置。
您可以在googletest阅读更多内容
fixtures 可用于集成测试或开发过程中(假设数据来自开发数据库的 ui 开发
用于数据库或测试的假用户
myproject/fixtures/my_fake_user.json
[
"model": "myapp.person",
"pk": 1,
"fields":
"first_name": "John",
"last_name": "Lennon"
,
"model": "myapp.person",
"pk": 2,
"fields":
"first_name": "Paul",
"last_name": "McCartney"
]
您可以从 django docs阅读更多内容
【讨论】:
以上是关于编程中的固定装置是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Play 框架中的 YAML 固定装置加载(静态嵌套)枚举值?
如何在 rails (4.1.5) 中创建固定装置(对于 Devise 用户)作为 yml.erb?