编程中的固定装置是什么?

340

我听过这个术语很多次(在编程的上下文中),但找不到任何对其含义的解释。有什么好的文章或解释吗?

6个回答

334
我想你指的是测试夹具
测试夹具的目的是确保测试运行在一个已知且固定的环境中,以便结果可重复。有些人称之为测试上下文。
夹具的例子包括:
- 加载一个特定的、已知数据集的数据库 - 擦除硬盘并安装已知的干净操作系统安装 - 复制一组特定的已知文件 - 准备输入数据并设置/创建虚假或模拟对象
(来源:维基百科,见上面的链接)
这里还有一些来自“Google Test”框架文档的实际示例

35
术语Fixture因上下文、编程语言或框架而异。
1.已知状态用于运行测试
撰写测试的其中一个最费时的部分是编写代码以将世界设置为已知状态,并在测试完成后将其返回到原始状态。这个已知状态称为测试的夹具。 PHP-Unit文档 测试夹具(也称为测试上下文)是运行测试所需的预设条件或状态。开发人员应在测试之前设置一个已知的正常状态,并在测试之后返回到原始状态。 Wikipedia(xUnit) 2.包含样本数据的文件
Fixture是样本数据的花哨说法。Fixture允许您在测试运行之前使用预定义的数据填充测试数据库。Fixture与数据库无关,并以YAML编写。每个模型有一个文件。 RubyOnRails.org 3.设置所需状态的过程。
软件测试夹具通过提供所有必要的代码来初始化系统,从而满足任何可能存在的前置条件,为测试过程设置系统。例如,在运行测试之前,从客户现场加载已知参数到数据库中。维基百科

32

我认为PHP单元测试对此有很好的解释:

编写测试中最耗费时间的部分之一是编写代码来设置世界处于已知状态,并在测试完成时将其返回到原始状态。这个已知状态称为测试的fixture。

Yii文档也很好地描述了fixture测试:

自动化测试需要执行多次。为了确保测试过程是可重复的,我们希望在一些已知的状态(称为fixture)下运行测试。例如,在博客应用程序中测试帖子创建功能时,每次运行测试时,存储有关帖子的相关数据的表(例如Post表,Comment表)都应恢复到某个固定状态。

这是fixture测试的一个简单示例:

<?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 单元测试有名为 setUptearDown 的函数,因此在运行测试之前,您可以设置数据,完成后可以将其恢复到初始状态。


10

就这个话题而言,JUnit有一个解释详细的文档。这里是链接!

文章相关部分如下:

测试需要在已知一组对象的背景下运行。这组对象称为测试夹具。编写测试时,您通常会发现编写设置夹具代码所花费的时间比实际测试价值更高。

在某种程度上,通过仔细关注您编写的构造函数,可以使编写夹具代码更容易。然而,更大的节省来自共享夹具代码。通常,您将能够为多个不同的测试使用相同的夹具。每种情况将向夹具发送稍微不同的消息或参数,并检查不同的结果。

当您拥有共同的夹具时,应执行以下操作:

为夹具的每个部分添加一个字段 用@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");
    }
}

2
在 Xamarin.UITest 中,它被解释如下:
通常,每个 Xamarin.UITest 都被编写为一个被称为测试的方法。包含测试的类被称为测试夹具。测试夹具包含单个测试或逻辑分组的测试,并负责设置任何需要运行测试和完成测试时需要执行的清理操作。每个测试都应遵循安排 - 操作 - 断言模式:
- 安排 - 测试将设置条件并初始化事物,以便可以执行操作。 - 操作 - 测试将与应用程序交互,输入文本,按按钮等。 - 断言 - 测试检查在操作步骤中执行的操作的结果以确定正确性。例如,应用程序可能会验证是否显示了特定的错误消息。
原始文章链接: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.");
        }
    }
}

希望这对于那些正在寻找更好理解编程中Fixture的人有所帮助。

2
我正在撰写这篇答案,作为自己关于“fixture”的快速笔记。

同一数据多个测试

测试夹具:在多个测试中使用相同的数据配置 如果您发现自己编写了两个或更多个操作类似数据的测试,则可以使用测试夹具。这允许您为几个不同的测试重用相同的对象配置。

您可以在googletest阅读更多信息。

夹具可以用于集成测试或开发过程中(比如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 文档 中了解更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接