ทดสอบหน่วย 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.