ทดสอบหน่วย NUnit หรือ Visual studio?


114

ฉันใช้ Visual Studio (บางครั้งก็มีความคมชัดมากขึ้น) เพื่อทำการทดสอบหน่วยของฉัน

ฉันได้ยินเกี่ยวกับ NUnit แต่ฉันไม่รู้หลายอย่างเกี่ยวกับมัน ...

ฉันควรสนใจหรือไม่ สามารถนำเสนอสิ่งที่ดีกว่า Visual Studio ได้หรือไม่?

ฉันควรใช้ NUnit และทำไม?


12
พิจารณา xunit ด้วยอย่างไรก็ตามสิ่งที่คุณมี TestDriven.net
— เอียนริงโรส


ลอง xunit.net เป็นโอเพ่นซอร์สและกรอบการทดสอบหน่วยที่ดีสำหรับแอป. net
— Mukesh Arora

คำตอบ:


100

NUnit มีข้อดีกว่า MS-Test เล็กน้อย

  1. แอตทริบิวต์ Suite - สามารถรวบรวมการทดสอบและดำเนินการแยกกันได้ (มีประโยชน์สำหรับโครงการขนาดใหญ่ที่มีการทดสอบที่รวดเร็วและช้า)
  2. วิธีการยืนยันที่อ่านได้เช่นAssert.AreEqual(expected, actual)เทียบกับAssert.That(actual, Is.EqualTo(expected))
  3. NUnit มีการอัปเดตเวอร์ชันบ่อย - MS-Test มีเพียงหนึ่งครั้งต่อเวอร์ชัน VS
  4. นักวิ่งแบบบูรณาการจำนวนมากรวมถึง Resharper และ TestDriven.NET
  5. การยืนยันข้อความข้อยกเว้นที่คาดไว้ - สามารถทำได้โดยใช้แอตทริบิวต์ใน NUnit แต่ต้องทำโดยใช้ Try-Catch ใน MS-Test
  6. [TestCase]! NUnit อนุญาตให้ทำการทดสอบตามพารามิเตอร์

32
นอกจากนี้ยังสามารถยืนยันข้อยกเว้นโดยแอตทริบิวต์ใน MS-Test:
— Stefan Steinegger

9
ฉันจะใช้ NUnit กับ Assert.Throws <> () เพราะสิ่งนี้เป็นไปตามหลักการ AAA ซึ่งไม่ผ่านสำหรับแอตทริบิวต์
— Oliver Hanappi

25
# 3 ไม่ใช่คุณสมบัติ แต่เป็นปัญหาและ # 5 เป็นเท็จ 100% MS Test มีแอตทริบิวต์ที่คาดหวังไว้และมักจะมี .
— Randolpho

4
@ เอลิชาอย่างที่ฉันจำได้ว่าพวกเขาจงใจไม่สนับสนุนการตรวจสอบข้อความเนื่องจากข้อความไม่ได้มีความสำคัญและสามารถกำหนดได้เอง นั่นคือจะไม่มีผลกับโฟลว์ของโปรแกรม
— Rob Kent

7
"# 3 ไม่ใช่คุณลักษณะ แต่เป็นปัญหา" - ฟังดูไม่เหมือนวิธีคิดที่
— ว่องไวเท่าไหร่

72

จากมุมมองปัจจุบันของฉัน (หลังจาก 8 เดือนของการพัฒนาโดยมีนักพัฒนาประมาณ 10 คนโดยเฉลี่ย) ฉันขอแนะนำให้ไม่ใช้ MSTest ด้วยเหตุผลต่อไปนี้

  • กรอบในตัวเองค่อนข้างช้า ฉันไม่ได้หมายถึงรหัสทดสอบที่คุณเขียน - อยู่ภายใต้การควบคุมของคุณ ฉันหมายความว่าเฟรมเวิร์กที่ทำการทดสอบนั้นช้าไม่ว่าจะเป็นการใช้ชุดทดสอบการทดสอบเดี่ยวเป็นต้น
  • ความจำเป็นในการเก็บไฟล์ Test-Metadata ซึ่งมักจะนำไปสู่ภาวะแทรกซ้อนเมื่อนักพัฒนาหลายคนกำลังดำเนินการอยู่ (สร้างใหม่เช่นข้อมูลเมตาเป็นต้น) ชุดทดสอบอื่น ๆ ทั้งหมดไม่จำเป็นต้องมีไฟล์ข้อมูลเมตา การจัดระเบียบการทดสอบของคุณเป็นเรื่องที่ดี แต่คุณสามารถทำแบบเดียวกันได้ผ่านเนมสเปซคลาสและชื่อวิธีการ
  • ทำการ Integration อย่างต่อเนื่องหากคุณต้องการเรียกใช้การทดสอบหน่วยบนเครื่อง build ของคุณคุณจะต้องติดตั้ง Visual Studio บนเครื่องนั้น

อีกอย่างถ้าฉันจะต้องตัดสินใจอีกครั้งเมื่อ 8 เดือนที่แล้วฉันก็คงต้องใช้ NUnit ฉันอาจไม่มีรายงานผลการทดสอบแบบรวม แต่นักพัฒนาจะมีประสบการณ์การทดสอบที่ราบรื่นยิ่งขึ้น


6
+1 หลีกเลี่ยง MSTest เว้นแต่คุณจะไม่มีทางเลือก เฟรมเวิร์กโอเพนซอร์สต่างๆนั้นดีกว่า (xUnit, NUnit, MbUnit ฯลฯ )
— Brannon

49

นี่คือประสบการณ์ของฉันกับ MS Test

  • เรากำลังทำการทดสอบ MS ด้วยการทดสอบประมาณ 3800
  • การทดสอบใช้เวลานานมากในการเริ่มดำเนินการซึ่งจะเจ็บปวดเมื่อทำการทดสอบเดี่ยว
  • ใช้หน่วยความจำประมาณ 1GB ในการดำเนินการทดสอบ ไม่มันไม่ได้เกิดจากการรั่วไหลของหน่วยความจำในการทดสอบของเรา บ่อยครั้งที่เราพบ OutOfMemoryExceptions
  • เนื่องจากใช้ทรัพยากรจำนวนมากเราจึงเริ่มดำเนินการทดสอบจากไฟล์แบทช์ แล้วการบูรณาการทั้งหมดดีสำหรับอะไร?
  • เป็นรถและไม่เสถียร:
    • ตัวอย่างเช่นหากคุณลบแอตทริบิวต์ [เพิกเฉย] ออกจากการทดสอบแอททริบิวต์จะไม่รู้จักเนื่องจากจะเก็บข้อมูลเกี่ยวกับการทดสอบไว้ที่ใดที่หนึ่ง คุณต้องรีเฟรชรายการทดสอบซึ่งบางครั้งสามารถแก้ปัญหาได้หรือรีสตาร์ท VS
    • สุ่มไม่คัดลอกแอสเซมบลีการอ้างอิงไปยังไดเร็กทอรีเอาต์
    • รายการการปรับใช้ (ไฟล์เพิ่มเติมที่จะใช้) ทำงานไม่ถูกต้อง พวกเขาจะถูกละเว้นแบบสุ่ม
  • มีข้อมูลที่ซ่อนอยู่ (มองไม่เห็นในรหัสทดสอบ) ในไฟล์ vsmdi และ testrunconfig หากคุณไม่สนใจมันอาจไม่ได้ผล
  • ในทางปฏิบัติอาจเทียบได้กับ NUnit แต่มีราคาแพงมากหากคุณพิจารณาใช้ VS tester edition

เพิ่มเติม: ตอนนี้เรามีการทดสอบเพิ่มเติมไม่สามารถบอกได้ว่ามีกี่แบบ เป็นไปไม่ได้ที่จะเรียกใช้ทั้งหมดจาก Visual Studio อีกต่อไปเนื่องจาก OutOfMemoryExceptions และปัญหาความไม่เสถียรอื่น ๆ เราเรียกใช้การทดสอบจากสคริปต์ การดูผลการทดสอบใน Visual Studio จะเป็นเรื่องง่าย แต่เมื่อเปิดโซลูชัน VS จะขัดข้อง (ทุกครั้ง) ดังนั้นเราต้องค้นหาการทดสอบที่ล้มเหลวโดยใช้การค้นหาข้อความ ไม่มีข้อได้เปรียบของเครื่องมือในตัวอีกต่อไป


การอัปเดตอื่น : ตอนนี้เราใช้ VS 2013 หลายสิ่งหลายอย่างเปลี่ยนไป พวกเขาเขียนโปรแกรมทดสอบ MS Test ใหม่เป็นครั้งที่สามนับตั้งแต่เราเริ่มต้น สิ่งนี้ทำให้เกิดการเปลี่ยนแปลงอย่างมาก แต่ไม่มีเวอร์ชันใหม่ที่ทำอะไรได้ดีขึ้น เราดีใจที่เราไม่ได้ใช้คุณสมบัติพิเศษของ MS Test เพราะทั้งหมดนี้ไม่ได้รับการสนับสนุนอีกต่อไป เป็นเรื่องที่น่าเสียดายจริงๆ เรายังคงใช้สคริปต์ในการสร้างและเรียกใช้การทดสอบหน่วยทั้งหมดเพราะมันสะดวกกว่า Visual Studio ต้องใช้เวลาสองสามนาทีในการเริ่มเรียกใช้การทดสอบ (วัดเวลาหลังจากการคอมไพล์จนถึงการทดสอบครั้งแรกเริ่ม) พวกเขาอาจแก้ไขได้ด้วยการอัปเดตและนี่อาจเป็นปัญหาเฉพาะของโครงการของเรา อย่างไรก็ตาม Resharper จะเร็วกว่ามากเมื่อทำการทดสอบเดียวกัน

สรุป : อย่างน้อยเมื่อใช้ร่วมกับ Resharper MS Test ก็มีประโยชน์ และฉันหวังว่าในที่สุดพวกเขาจะค้นพบว่านักวิ่งทดสอบควรเขียนอย่างไรและจะไม่ทำการเปลี่ยนแปลงที่ผิดปกติแบบนี้เมื่อเราอัปเดต Visual Studio ในครั้งต่อไป


ผมเพิ่งเริ่มต้นทำงานได้โดยไม่ต้องแก้จุดบกพร่องทำให้มันมากขึ้นเร็วขึ้นและมากขึ้นเช่นวิธี NUnit อาจจะใช้ แต่ก็ยังคง sucky ดูเหมือนว่าประสิทธิภาพที่ไม่ดีนั้นเกี่ยวข้องกับ Visual Studio ที่ทำสิ่งที่ขี้ขลาดเมื่อทำการดีบัก (นั่นคือใช้ "ctrl + F5" แทนที่จะใช้แค่ "F5" - คุณยังคงได้รับ "การรวม" ที่ดีกับ VS)
— Arafangion

คำตอบที่ดีประหยัดเวลาของฉัน
— FindOutIslamNow

18

NUnit สามารถใช้ร่วมกับ Visual Studio ได้ มันเป็นกรอบไม่ใช่โปรแกรมแยกต่างหาก ดังนั้นคุณสามารถดูแลดูว่าเหมาะกับคุณหรือไม่ :)

ข้อความแสดงแทน http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

"หลังจากติดตั้งปลั๊กอินแล้วคุณจะพบเมนูย่อยใหม่ภายใต้เมนูเครื่องมือ"

ดูhttp://nunitit.codeplex.com/สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการนำเข้า

นอกจากนี้ยังสามารถพบได้มากมายโดยใช้การค้นหา SO หัวข้อนี้แสดงข้อดีของ NUnit มากกว่าการทดสอบมาตรฐาน MS เช่น



3

NUnit ทำงานร่วมกับ VS. รุ่น Standard


1
อย่าลืมเวอร์ชัน Visual Studios express
— chobo2

ขั้นตอนหลังสร้างในโครงการประกอบการทดสอบหน่วย - \ path \ to \ nUnit $ (TargetFileName)
— Steve Gilham

1

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


1

NUnit เป็นกรอบการทดสอบหน่วยซึ่งได้รับการสนับสนุนโดย resharper ฉันคิดว่าคุณกำลังใช้กรอบการทดสอบหน่วยของ Microsoft ดังนั้น NUnit จึงเป็นเพียงทางเลือกสำหรับผลิตภัณฑ์ของ Microsoft เท่านั้น)

นี่คือลิงค์ไปยังหน้าแรกของ NUnit: http://nunit.org


คุณหมายความว่าแม่ชีไม่ได้นำสิ่งอื่นใดนอกจากกรอบการทดสอบหน่วย Microsoft?
— ทิม

ดูลิงค์ของฉันเช่นในโพสต์ของฉัน (ด้านบน)
— bastijn

ฉันใช้ NUnit และไม่รู้จริงๆเกี่ยวกับกรอบการทดสอบหน่วยของ Microsoft ดังนั้นฉันจึงไม่สามารถพูดได้ว่าอะไรดีกว่ากัน ฉันคิดว่ามีโอกาสดีที่คุณจะพบหัวข้อเกี่ยวกับความแตกต่างที่นี่ใน SO
— Oliver Hanappi

มีโครงสร้างที่มีประโยชน์บางอย่างเช่น [TestCase] ​​สำหรับการเรียกใช้วิธีการทดสอบหนึ่งวิธีที่มี args ต่างกัน [ทฤษฎี] - สำหรับการสร้างข้อกำหนดที่ละเอียดขึ้นและอื่น ๆ นอกจากนี้ยังสนับสนุนไวยากรณ์ที่คล่องแคล่วดีสำหรับการยืนยัน และสุดท้าย แต่ไม่ท้ายสุดมีการใช้งานที่กว้างกว่า MSTest มากดังนั้นคุณจะมีโอกาสได้รับการสนับสนุน / ข้อมูลดีกว่าหากคุณประสบปัญหา
— elder_george

0

ในNUnitการทดสอบจะไม่ดำเนินการควบคู่กัน แต่ดูเหมือนว่าการทดสอบทั้งหมดจะดำเนินการในเธรดเดียว ใน MSTest การทดสอบแต่ละครั้งจะถูกสร้างอินสแตนซ์บนเธรดที่แยกจากกันซึ่งส่งผลให้การรันถูกแทรกสลับกัน ดังนั้นหากการทดสอบ A ขึ้นอยู่กับการทดสอบ B สำหรับความสำเร็จก็มีแนวโน้มที่จะล้มเหลวเนื่องจากการทดสอบ B มีแนวโน้มที่จะเริ่มทำงานเมื่อการทดสอบ A กำลังทำงานอยู่


-12

หากคุณใช้ Visual Studio คุณต้องใช้ NUnit เพื่อทำการทดสอบหน่วยและถ้าคุณกำลังเรียกใช้ java (Netbeans) คุณต้องใช้ JUnit สำหรับการทดสอบหน่วย

นี่คือตัวอย่างสำหรับการทดสอบหน่วยเครื่องคิดเลขอย่างง่าย

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}

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