การแข่งขันในการเขียนโปรแกรมคืออะไร?


191

ฉันเคยได้ยินคำนี้มาหลายครั้ง (ในบริบทของการเขียนโปรแกรม) แต่ไม่สามารถหาคำอธิบายเกี่ยวกับสิ่งที่มันหมายถึง มีบทความหรือคำอธิบายที่ดีบ้างไหม?

คำตอบ:


195

ฉันคิดว่าคุณหมายถึงการทดสอบการติดตั้ง :

วัตถุประสงค์ของการติดตั้งการทดสอบคือเพื่อให้แน่ใจว่ามีสภาพแวดล้อมที่รู้จักกันดีและคงที่ซึ่งการทดสอบจะทำงานเพื่อให้ผลลัพธ์ที่ทำซ้ำ บางคนเรียกสิ่งนี้ว่าบริบทการทดสอบ

ตัวอย่างของการแข่งขัน:

  • กำลังโหลดฐานข้อมูลด้วยชุดข้อมูลเฉพาะที่เป็นที่รู้จัก
  • การลบฮาร์ดดิสก์และติดตั้งการติดตั้งระบบปฏิบัติการที่รู้จัก
  • การคัดลอกชุดไฟล์ที่รู้จักเป็นพิเศษ
  • การเตรียมข้อมูลอินพุตและการตั้งค่า / การสร้างวัตถุปลอมหรือจำลอง

(ที่มา: วิกิพีเดียดูลิงค์ด้านบน)

ที่นี่ยังมีบางตัวอย่างการปฏิบัติจากเอกสารของกรอบ 'Google ทดสอบฯ


13

ฉันคิดว่าการทดสอบหน่วย PHP มีคำอธิบายที่ดีมาก:

หนึ่งในส่วนที่ใช้เวลามากที่สุดในการทำข้อสอบคือการเขียนรหัสเพื่อกำหนดโลกให้อยู่ในสถานะที่รู้จักแล้วกลับสู่สถานะดั้งเดิมเมื่อการทดสอบเสร็จสมบูรณ์ สถานะที่รู้จักนี้เรียกว่าฟิกซ์เจอร์ทดสอบ

นอกจากนี้เอกสาร Yii อธิบายการทดสอบการติดตั้งในรูปร่างที่ดี:

การทดสอบอัตโนมัติจะต้องดำเนินการหลายครั้ง เพื่อให้แน่ใจว่ากระบวนการทดสอบสามารถทำซ้ำได้เราต้องการเรียกใช้การทดสอบในบางรัฐที่รู้จักกันว่าฟิกซ์เจอร์ ตัวอย่างเช่นในการทดสอบคุณสมบัติการสร้างโพสต์ในแอปพลิเคชันบล็อกทุกครั้งที่เราทำการทดสอบตารางที่จัดเก็บข้อมูลที่เกี่ยวข้องเกี่ยวกับการโพสต์ (เช่นตารางโพสต์ตารางความคิดเห็น) ควรได้รับการกู้คืนสู่สถานะคงที่

นี่คือตัวอย่างง่ายๆของการทดสอบการติดตั้ง

<?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ก่อนที่จะทำการทดสอบคุณตั้งค่าข้อมูลของคุณและเมื่อเสร็จแล้วคุณสามารถคืนค่าให้อยู่ในสถานะเริ่มต้น


7

คำที่ติดตั้งแตกต่างกันไปตามบริบทภาษาโปรแกรมหรือกรอบ

1. สถานะที่ทราบที่ใช้ทดสอบอยู่

หนึ่งในส่วนที่ใช้เวลามากที่สุดในการทำข้อสอบคือการเขียนรหัสเพื่อกำหนดโลกให้อยู่ในสถานะที่รู้จักแล้วกลับสู่สถานะดั้งเดิมเมื่อการทดสอบเสร็จสมบูรณ์ สถานะที่รู้จักนี้เรียกว่าฟิกซ์เจอร์ทดสอบ เอกสาร PHP-Unit

ฟิกซ์เจอร์ทดสอบ (หรือเรียกอีกอย่างว่าบริบทการทดสอบ) คือชุดของเงื่อนไขเบื้องต้นหรือสถานะที่จำเป็นในการรันการทดสอบ ผู้พัฒนาควรตั้งค่าสถานะที่รู้จักดีก่อนการทดสอบและกลับสู่สถานะเดิมหลังจากการทดสอบ Wikipedia (xUnit)

2. ไฟล์ที่มีข้อมูลตัวอย่าง

การแข่งขันเป็นคำแฟนซีสำหรับข้อมูลตัวอย่าง การติดตั้งช่วยให้คุณสามารถเติมฐานข้อมูลการทดสอบของคุณด้วยข้อมูลที่กำหนดไว้ล่วงหน้าก่อนที่การทดสอบของคุณจะทำงาน การแข่งขันเป็นฐานข้อมูลที่เป็นอิสระและเขียนใน YAML มีหนึ่งไฟล์ต่อหนึ่งรุ่น RubyOnRails.org

3. กระบวนการที่ตั้งค่าสถานะที่ต้องการ 

ฟิกซ์เจอร์ทดสอบซอฟต์แวร์จะตั้งค่าระบบสำหรับกระบวนการทดสอบโดยจัดเตรียมรหัสที่จำเป็นทั้งหมดเพื่อเริ่มใช้งาน ตัวอย่างสามารถโหลดฐานข้อมูลด้วยพารามิเตอร์ที่รู้จักจากไซต์ลูกค้าก่อนทำการทดสอบ วิกิพีเดีย


5

ตรงกับหัวข้อนั้น JUnit มีเอกสารอธิบายอย่างดี นี่คือลิงค์!

ส่วนที่เกี่ยวข้องของบทความคือ:

การทดสอบจะต้องทำงานกับพื้นหลังของชุดของวัตถุที่รู้จัก ชุดของวัตถุนี้เรียกว่าฟิกซ์เจอร์ทดสอบ เมื่อคุณกำลังเขียนการทดสอบคุณมักจะพบว่าคุณใช้เวลาเขียนรหัสเพื่อตั้งค่าการติดตั้งมากกว่าที่คุณทำในการทดสอบค่าจริง

ในระดับหนึ่งคุณสามารถทำการเขียนรหัสการติดตั้งได้ง่ายขึ้นโดยให้ความสนใจกับตัวสร้างที่คุณเขียน อย่างไรก็ตามการประหยัดที่ใหญ่กว่านั้นมาจากการแชร์รหัสประจำที่ บ่อยครั้งคุณจะสามารถใช้ฟิกซ์เจอร์เดียวกันสำหรับการทดสอบหลายแบบ แต่ละกรณีจะส่งข้อความหรือพารามิเตอร์ที่แตกต่างกันเล็กน้อยไปยังฟิกซ์เจอร์และจะตรวจสอบผลลัพธ์ที่แตกต่างกัน

เมื่อคุณมีการติดตั้งทั่วไปนี่คือสิ่งที่คุณทำ:

เพิ่มฟิลด์สำหรับแต่ละส่วนของฟิกซ์เจอร์ให้ทำหมายเหตุประกอบเมธอดด้วย @ org.junit.Before และเริ่มต้นตัวแปรในเมธอดนั้นหมายเหตุวิธีการกับ @ org.junit.A หลังจากที่ปล่อยรีซอร์สถาวรใด ๆ ที่คุณจัดสรรไว้ใน 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 จะถูกเขียนเป็นวิธีการที่เรียกว่าการทดสอบ คลาสที่มีการทดสอบเรียกว่าฟิกซ์เจอร์ทดสอบ ฟิกซ์เจอร์ทดสอบประกอบด้วยการทดสอบเดี่ยวหรือการจัดกลุ่มแบบลอจิคัลของการทดสอบและรับผิดชอบการตั้งค่าใด ๆ เพื่อให้การทดสอบการทำงานและการล้างข้อมูลใด ๆ ที่ต้องดำเนินการเมื่อการทดสอบเสร็จสิ้น การทดสอบแต่ละครั้งควรเป็นไปตามรูปแบบ Arrange-Act-Assert:

  • จัดเรียง - การทดสอบจะตั้งค่าเงื่อนไขและเริ่มต้นสิ่งต่าง ๆ เพื่อให้การทดสอบสามารถดำเนินการได้
  • 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.");
        }
    }
}

หวังว่าสิ่งนี้อาจเป็นประโยชน์กับคนที่ค้นหาความเข้าใจที่ดีขึ้นเกี่ยวกับการแข่งขันในการเขียนโปรแกรม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.