NUnit vs. MbUnit กับ MSTest vs. xUnit.net [ปิด]


390

มีกรอบ unittesting ค่อนข้างมากสำหรับ NET. ฉันพบการเปรียบเทียบคุณสมบัติเล็กน้อยนี้: http://xunit.github.io/docs/comparisons.html

ตอนนี้ฉันจะเลือกสิ่งที่ดีที่สุดสำหรับเรา แต่อย่างไร มันสำคัญไหม อันไหนเป็นข้อพิสูจน์ในอนาคตมากที่สุดและมีแรงผลักดันที่ดีอยู่ข้างหลัง? ฉันควรสนใจเกี่ยวกับคุณสมบัติหรือไม่ ในขณะที่ xUnit ดูเหมือนจะทันสมัยที่สุดและออกแบบมาโดยเฉพาะสำหรับ. NET แต่ NUnit ก็ดูเหมือนจะเป็นที่ยอมรับอย่างกว้างขวาง MSTest ถูกรวมเข้ากับ Visual Studio อีกครั้ง ...


11
ตารางเปรียบเทียบนั้นเป็นปีที่ล้าสมัย ตัวอย่างเช่น NUnit ยังมี Assert.Throws และทุกอย่างในตาราง Assertions ก็คือ API เก่า Assert ใหม่นั่นคือ (... คือ .... ) ไวยากรณ์ได้อย่างคล่องแคล่วนั้นดีกว่ามากและได้รับการแก้ไขเป็นอย่างดีในขณะนี้
Jim Cooper

11
คุณรู้ตารางที่เป็นปัจจุบันหรือไม่?
bitbonk

1
ช่วงปลายปี 2013 ย้ายจาก xUnit.net => NUnit นอกจากนี้โปรดทราบว่า xUnit.NET (โครงการ)! = xUnit (หมวดหมู่ซึ่ง NUnit เป็นสมาชิก)
DeepSpace101

3
@Sid ทำไมคุณย้ายจาก xUnity.net => NUnit
Alexander Logger

2
คำถามที่คล้ายกันถามในปี 2014 Visual Studio 2013 MSTest กับ NUnit
Michael Freidgeim

คำตอบ:


197

ฉันรู้ว่านี้เป็นหัวข้อเก่า แต่ฉันคิดว่าฉันต้องการโพสต์ลงคะแนนเสียงสำหรับxUnit.NET ในขณะที่กรอบการทดสอบอื่น ๆ ที่กล่าวถึงส่วนใหญ่นั้นเหมือนกันทั้งหมด xUnit.NET ได้นำวิธีการทดสอบหน่วยที่แปลกใหม่ทันสมัยและมีความยืดหยุ่นมาใช้ มันเปลี่ยนคำศัพท์ดังนั้นคุณจึงไม่ได้กำหนด TestFixtures and Tests อีกต่อไป ... คุณระบุข้อเท็จจริงและทฤษฎีเกี่ยวกับรหัสของคุณซึ่งรวมเข้ากับแนวคิดของการทดสอบที่ดีขึ้นจากมุมมองของ TDD / BDD

xUnit.NET ยังสามารถขยายได้อย่างมาก คลาสแอ็ตทริบิวต์ FactAttribute และ TraitAttribute ของมันไม่ได้ถูกปิดผนึกและจัดเตรียมเมธอด overridable ที่ให้คุณควบคุมจำนวนมากเกี่ยวกับวิธีที่แอ็ตทริบิวต์เหล่านั้นควรถูกเรียกใช้งาน แม้ว่า xUnit.NET ในรูปแบบเริ่มต้นจะช่วยให้คุณสามารถเขียนคลาสการทดสอบที่คล้ายกับการทดสอบการทดสอบ NUnit ด้วยวิธีการทดสอบของพวกเขา แต่คุณไม่ได้ จำกัด อยู่ในรูปแบบของการทดสอบหน่วยนี้เลย คุณมีอิสระที่จะขยายกรอบการสนับสนุน BDD สไตล์ข้อกำหนดกังวล / บริบท / สังเกตการณ์เป็นภาพที่นี่

xUnit.NET ยังรองรับการทดสอบรูปแบบพอดีโดยตรงจากกล่องด้วยแอตทริบิวต์ทฤษฎีและคุณลักษณะข้อมูลที่สอดคล้องกัน ข้อมูลที่ใส่ได้พอดีอาจโหลดจาก excel ฐานข้อมูลหรือแม้แต่แหล่งข้อมูลที่กำหนดเองเช่นเอกสาร Word (โดยการขยายแอตทริบิวต์ฐานข้อมูล) สิ่งนี้ช่วยให้คุณสามารถใช้ประโยชน์จากแพลตฟอร์มการทดสอบเดียวสำหรับการทดสอบหน่วยและการทดสอบการรวม สามารถลดการพึ่งพาผลิตภัณฑ์และฝึกอบรมได้อย่างมาก

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


35
แม้ว่าสิ่งนี้จะเป็นจริงเมื่อหนึ่งปีที่แล้ว แต่ NUnit ได้เพิ่มคุณลักษณะส่วนใหญ่ในคำถาม ใน NUnit คุณสามารถเขียนแบบทดสอบได้ทั้งสองวิธี
Mark Levison

8
มันไม่มากเกี่ยวกับคุณลักษณะที่มีอยู่ แต่วิธีที่พวกเขาสามารถนำมาใช้ xUnit.NET ได้รับการออกแบบมาจากพื้นฐานเพื่อให้มีความยืดหยุ่นสูงและสามารถขยายได้ซึ่งไม่ได้ล็อคคุณเข้ากับวิธีการทดสอบใด ๆ โดยเฉพาะและไม่ต้องการให้คุณอัปเดตเฟรมเวิร์กหลักเพื่อรับความสามารถล่าสุด
Crista

9
1. ชื่อที่แตกต่างอย่างเห็นได้ชัดในแอตทริบิวต์จะไม่สร้างจุดมากนัก 2. NUnit สามารถขยายได้และยังสามารถขยายได้:? 3. พารามิเตอร์แถวข้อมูลสำหรับการทดสอบได้รับการสนับสนุนในหน่วย nunit เวลาที่พวกเขาได้รับการสนับสนุนในส่วนขยาย :) 4. Nunit รวมกับ Moq สร้างสิ่งเดียวกัน 5. สำหรับ BDD ฉันจะบอก specflow ที่รวมเข้ากับกรอบการทดสอบหน่วยต่างๆได้อย่างง่ายดาย
graffic

8
ฉันชอบเสียงของ xUnit แต่มันมีเอกสาร zilch :(
Colonel Panic

10
xUnit ไม่มีเอกสารใด ๆ ! เช่น: ลองค้นหาสิ่งที่Traitจริงหรือถ้าคุณสามารถจัดกลุ่มการทดสอบต่าง ๆ ในการทดสอบหลักเดียว (เช่นทั้งหมดtestsภายใน a testfixture) nUnit สร้างมุมมองแบบลำดับชั้นที่ดีแทนการทดสอบแบบแบนของ xUnit รวมถึงศัพท์เฉพาะที่ไม่สมเหตุสมผล - ข้อเท็จจริงและทฤษฎี? เป็นจริง! สิ่งเหล่านี้เรียกว่าการทดสอบและข้อมูลที่ดีกว่า
DeepSpace101

134

NUnit อาจได้รับการสนับสนุนมากที่สุดโดยเครื่องมือของบุคคลที่สาม มันยาวกว่าอีกสามเท่า

โดยส่วนตัวแล้วฉันไม่ค่อยสนใจกรอบการทดสอบหน่วยมากนักการเยาะเย้ยห้องสมุดนั้นสำคัญมากสำหรับ IMHO (และล็อคคุณไว้อีกมาก) เพียงแค่เลือกหนึ่งและติดกับมัน


3
สิ่งที่ห้องสมุดจำลองชั้นนำของคุณเลือกคืออะไร?
dplante

31
ฉันชอบ Moq RhinoMocks ก็ดีเหมือนกัน
Alexander Kojevnikov

5
มันอาจคุ้มค่าที่จะตรวจสอบ Pex และ Moles ส่วนที่เป็นโมลโดยเฉพาะนั้นมีประโยชน์สำหรับการเยาะเย้ย
Charles Prakash Dasari

4
MSPec กับ FakeItEasy ... ทำให้กรณีทดสอบอ่านง่ายขึ้น
Robie

5
MSpec กับ NSubstitute และ AutoFixture เป็นตัวเลือกของฉัน
Daniel Hilgarth

108

ฉันจะไม่ไปกับ MSTest แม้ว่ามันอาจเป็นข้อพิสูจน์ในอนาคตที่สุดของกรอบการทำงานกับ Microsoft ที่อยู่เบื้องหลังไม่ใช่โซลูชันที่ยืดหยุ่นที่สุด มันจะไม่ทำงานเดี่ยวโดยไม่มีแฮ็ค ดังนั้นการเรียกใช้มันบนบิลด์เซิร์ฟเวอร์อื่นที่ไม่ใช่ TFS โดยไม่ต้องติดตั้ง Visual Studio นั้นยาก Visual Studio Test-Runner นั้นช้ากว่า Testdriven.Net + และกรอบงานอื่น ๆ และเนื่องจากการวางจำหน่ายของเฟรมเวิร์กนี้เชื่อมโยงกับรีลีสของ Visual Studio จึงมีการอัปเดตน้อยลงและถ้าคุณต้องทำงานกับ VS ที่เก่ากว่าคุณจะเชื่อมโยงกับ MSTest รุ่นเก่า

ฉันไม่คิดว่ามันสำคัญอะไรกับกรอบงานอื่นที่คุณใช้ มันง่ายมากที่จะเปลี่ยนจากที่หนึ่งไปยังอีกที่หนึ่ง

ฉันใช้ XUnit.Net หรือ NUnit เป็นการส่วนตัวโดยขึ้นอยู่กับความชอบของเพื่อนร่วมงานของฉัน NUnit เป็นมาตรฐานที่สุด XUnit.Net เป็นเฟรมเวิร์กที่น้อยที่สุด


36
ฉันถูกลากเตะและส่งเสียงกรี๊ดถึงข้อสรุปเดียวกันนี้ ฉันต้องการใช้ MSTest เพราะมันรวมเข้ากับ Visual Studio แต่นั่นก็เป็นจุดอ่อน ฉันต้องทำการทดสอบบนเซิร์ฟเวอร์ที่ไม่ใช่ของ Microsoft และไม่มีทางที่ฉันจะติดตั้ง Visual Studio บนมันเพื่อให้ได้สิ่งนั้น มันเป็นความอัปยศที่ Microsoft สร้างเครื่องมือที่ยอดเยี่ยมและทำให้ไม่สามารถบรรลุได้
Tim Long

11
+1 สำหรับการเรียกความน่าสะพรึงกลัวที่ MSTest ในตอนท้ายของวันนั้นไม่สำคัญว่าคุณจะใช้กรอบการทดสอบหน่วยใดตราบใดที่ไม่ใช่ MSTest
Mike Mooney

21

พิจารณาการเสริมไม่แทนที่ MSTest ด้วยกรอบการทดสอบอื่น คุณสามารถผสานรวม Visual Studio MSTest ในขณะที่รับประโยชน์จากกรอบการทดสอบที่มีคุณลักษณะครบถ้วนมากขึ้น

ตัวอย่างเช่นฉันใช้ xUnit กับ MSTest เพิ่มการอ้างอิงไปยังแอสเซมบลี xUnit.dll และทำสิ่งนี้ น่าประหลาดใจมันใช้งานได้!

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;  // <-- Aliasing the Xunit namespace is key

namespace TestSample
{
    [TestClass]
    public class XunitTestIntegrationSample
    {
        [TestMethod]
        public void TrueTest()
        {
            Assert.True(true);  // <-- this is the Xunit.Assert class
        }

        [TestMethod]
        public void FalseTest()
        {
            Assert.False(true);
        }
    }
}

เทคนิคนี้อาจใช้ได้กับ NUnit, MBUnit หรือกรอบการทดสอบอื่น ๆ ที่กล่าวถึงในคำตอบอื่น ๆ แต่ฉันไม่ได้ลองเลย
Matt Crouch

1
คุณคิดว่าฉันจะได้รับการทดสอบพารามิเตอร์เพื่อทำงานกับ MSTest ด้วยวิธีการนี้แมตต์?
DevDave

@DevDave ไม่ในตัวอย่างของเขาเขาเพิ่งใช้ชั้นเรียนจากการชุมนุมอื่น หากคุณต้องการทดสอบแบบกำหนดพารามิเตอร์คุณจะต้องใช้กรอบการทดสอบอื่นที่สร้างขึ้นเป็นพิเศษเพื่อขยาย MSTest
zoran404

3
Suprisingly, it just works!คุณเพิ่งเรียกฟังก์ชันคงที่จากชุดประกอบอื่น ทำไมคุณถึงแปลกใจว่ามันใช้งานได้? นอกจากนี้หากคุณต้องการการยืนยันว่าทำไมไม่ใช้ชุดประกอบที่ทำขึ้นโดยเฉพาะ
zoran404

9

นูนิททำงานได้ไม่ดีกับโปรเจคโหมดผสมใน C ++ ดังนั้นฉันจึงต้องวางมันลง


3
ฉันไม่ได้ภูมิใจในคำตอบนี้ แต่ฉันได้ทดสอบหน่วยสำหรับโครงการนั้น ฉันใช้วิธีการตรวจสอบความถูกต้องจำนวนมากสำหรับการตรวจหาข้อผิดพลาดรันไทม์
Eric

2
ฉันหวังว่าจะใช้ NUnit ในโหมดผสม แต่ก็พบว่าไม่เพียงพอในที่สุดฉันก็ไปหา googletest ซึ่งเป็นกรอบการทดสอบหน่วย C ++ ที่ยอดเยี่ยมและง่ายต่อการตั้งค่า
พริก

8

มันไม่ใช่เรื่องใหญ่ในระดับเล็ก / ส่วนบุคคล แต่มันสามารถกลายเป็นเรื่องใหญ่ได้อย่างรวดเร็วในระดับที่ใหญ่กว่า นายจ้างของฉันเป็นร้านค้าขนาดใหญ่ของ Microsoft แต่จะไม่ / ไม่สามารถซื้อเข้าสู่ระบบทีม / TFS ด้วยเหตุผลหลายประการ ขณะนี้เราใช้ Subversion + Orcas + MBUnit + TestDriven.NET และใช้งานได้ดี แต่การได้รับ TD.NET นั้นยุ่งยากมาก ความไวรุ่นของ MBUnit + TestDriven.NET เป็นปัญหาใหญ่เช่นกันและการมีสิ่งทางการค้าเพิ่มเติมอีกหนึ่งรายการ (TD.NET) เพื่อให้ถูกกฎหมายเพื่อตรวจสอบและจัดหาเพื่อจัดการและจัดการไม่ใช่เรื่องง่าย บริษัท ของฉันเหมือนหลาย บริษัท มีความสุขและมีความสุขกับรูปแบบการสมัครสมาชิก MSDN และมันไม่ได้ใช้เพื่อจัดการกับการจัดหาเพียงครั้งเดียวสำหรับนักพัฒนาหลายร้อยคน กล่าวอีกอย่างหนึ่งข้อเสนอของ MS แบบครบวงจรในขณะที่ไม่ได้ดีที่สุดของขนมปังเสมอไปก็คือการเพิ่มมูลค่าที่สำคัญในความคิดของฉัน

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


2
ReSharper มีข้อเสนอที่น่าสนใจในพื้นที่นี้!
กระรอก

7
คำตอบของคุณคืออยากรู้อยากเห็นและดูเหมือนจะขัดแย้งกัน คุณบอกว่าคุณเป็นร้านค้าขนาดใหญ่ของ Microsoft แต่จะไม่ใช้ TFS (ซึ่งก็คือทั้งหมด - คุณจะไม่ได้รับประโยชน์จากการรวมระบบตามแนวตั้ง) และใช้รูปแบบการสมัครสมาชิก MSDN แต่กำลังใช้ วิธี -MS ฉันหลงทางไปแล้ว คำตอบที่ล้าสมัยน่าเสียดาย
nicodemus13

6

ไม่ใช่เรื่องใหญ่มันง่ายที่จะสลับไปมาระหว่างพวกเขา การรวม MSTest ไม่ใช่เรื่องใหญ่อะไรเช่นกันเพียงแค่คว้า testdriven.net

เช่นเดียวกับคนก่อนหน้ากล่าวว่าเลือกกรอบการเยาะเย้ยฉันชอบในตอนนี้คือ

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