279

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

4

6 回答 6

278

我认为您指的是测试装置

测试夹具的目的是确保有一个众所周知的固定环境来运行测试,以便结果可重复。有些人称之为测试上下文。

夹具示例:

  • 使用特定的已知数据集加载数据库
  • 擦除硬盘并安装已知的干净操作系统安装
  • 复制一组特定的已知文件
  • 输入数据的准备和假或模拟对象的设置/创建

(来源:维基百科,见上面的链接)

这里还有一些来自“谷歌测试”框架文档的实际例子

于 2013-02-04T10:06:07.813 回答
23

我认为 PHP 单元测试很好地解释了这一点:

编写测试最耗时的部分之一是编写代码以将世界设置为已知状态,然后在测试完成时将其返回到原始状态。这种已知状态称为测试的夹具。

Yii 的文档也很好地描述了夹具测试:

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

这里是夹具测试的简单示例

<?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在运行测试之前,您可以设置数据,完成后您可以将它们恢复到初始状态。

于 2017-07-31T05:32:41.783 回答
18

固定装置一词因上下文、编程语言或框架而异。

1. 运行测试所针对的已知状态

编写测试最耗时的部分之一是编写代码以将世界设置为已知状态,然后在测试完成时将其返回到原始状态。这种已知状态称为测试的夹具。 PHP 单元文档

测试夹具(也称为测试上下文)是运行测试所需的一组前提条件或状态。开发者应在测试前建立一个已知的良好状态,并在测试后恢复到原来的状态。 维基百科 (xUnit)

2. 包含样本数据的文件

夹具是样本数据的一个花哨的词。Fixtures 允许您在测试运行之前使用预定义的数据填充测试数据库。Fixtures 独立于数据库并用 YAML 编写。每个模型有一个文件。 RubyOnRails.org

3. 设置所需状态的过程。 

软件测试夹具通过为其提供所有必要的代码来初始化它,从而为测试过程设置系统,从而满足可能存在的任何先决条件。一个示例可能是在运行测试之前从客户站点加载具有已知参数的数据库。 维基百科

于 2019-09-28T18:32:27.977 回答
9

正是针对该主题,JUnit 有一个很好解释的文档。是链接!

文章的相关部分是:

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

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

当你有一个共同的固定装置时,你可以这样做:

为fixture的每个部分添加一个字段使用@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");
    }
}
于 2017-05-24T09:13:55.033 回答
2

我正在写这个答案作为自己关于什么是“夹具”的快速说明。

相同数据多次测试

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

你可以在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文档中了解更多信息

于 2020-07-28T04:23:37.963 回答
2

在 Xamarin.UITest 中解释如下:

通常,每个 Xamarin.UITest 都编写为称为测试的方法。包含测试的类称为测试夹具。测试夹具包含单个测试或测试的逻辑分组,并负责进行任何设置以使测试运行以及在测试完成时需要执行的任何清理。每个测试都应该遵循 Arrange-Act-Assert 模式:

  • 安排 - 测试将设置条件并初始化事物,以便可以执行测试。
  • Act – 测试将与应用程序交互、输入文本、按下按钮等。
  • 断言 - 测试检查在 Act 步骤中执行的操作的结果以确定正确性。例如,应用程序可以验证是否显示了特定的错误消息。

以上摘录原文链接

在 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.");
        }
    }
}

希望这可能对寻求更好地了解编程中的夹具的人有所帮助。

于 2018-11-08T08:38:38.870 回答