编程中的固定装置是啥?

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

【讨论】:

【参考方案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?

pytest 如何以及在哪里找到固定装置

Django 固定装置:通过 JSON 将 HTML 数据导入 TextField

六空锁定钢板是啥材料的?

嵌入式 是啥