단위 테스트, NUnit 또는 Visual Studio?


114

단위 테스트를 실행하기 위해 Visual Studio (때로는 resharper)를 사용하고 있습니다.

NUnit에 대해 들었지만 그것에 대해 많이 알지 못합니다 ...

내가 신경 써야하나요? 비주얼 스튜디오보다 더 나은 것을 제공 할 수 있습니까?

NUnit을 사용해야하며 그 이유는 무엇입니까?


12
또한 xunit을 고려하십시오. 그러나 당신이 무엇을 하든지 TestDriven.net을보십시오
Ian Ringrose


xunit.net을 사용해보십시오. .net 앱을위한 오픈 소스 및 멋진 단위 테스트 프레임 워크입니다.
Mukesh Arora

답변:


100

NUnit은 MS-Test에 비해 장점이 거의 없습니다.

  1. Suite 속성-테스트를 ​​집계하고 개별적으로 실행할 수 있습니다 (예 : 빠르고 느린 테스트가있는 대규모 프로젝트에 유용함).
  2. 읽기 가능한 Assert 방법, 예 : Assert.AreEqual(expected, actual)vsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit에는 버전 업데이트가 자주 있습니다. MS-Test에는 VS 버전 당 하나만 있습니다.
  4. Resharper 및 TestDriven.NET을 포함한 많은 통합 러너
  5. 예상되는 예외 메시지 어설 션-NUnit의 속성을 사용하여 수행 할 수 있지만 MS-Test의 Try-Catch를 사용하여 수행해야합니다.
  6. [TestCase]! NUnit은 매개 변수화 된 테스트를 허용합니다.

32
MS-Test : ExpectedExceptionAttribute의 특성에 의해 예외가 어설 션 될 수도 있습니다.
Stefan Steinegger

9
Assert.Throws <> ()와 함께 NUnit을 사용하는 이유는 속성 방식을 통하지 않는 AAA 원칙을 따르기 때문입니다.
Oliver Hanappi

25
# 3은 기능이 아니라 문제이고 # 5는 100 % 거짓입니다. MS Test에는 ExpectedException 속성이 있으며 항상 .
Randolpho

4
@Elisha 내가 기억하는 것처럼, 그들은 텍스트가 중요하지 않고 임의적 일 수 있기 때문에 메시지 텍스트 검사를 의도적으로 지원하지 않았습니다. 즉, 프로그램의 흐름에 영향을주지 않습니다.
Rob Kent

7
생각의 매우 민첩한 방법 같은 소리하지 않습니다 ... - "# 3 기능이 아닙니다, 그것은 문제입니다"
SamuelKDavis

72

현재의 관점에서 (평균 10 명의 개발자와 8 개월 간의 개발 후) 다음과 같은 이유로 MSTest 사용을 권장 하지 않습니다.

  • 프레임 워크 자체는 매우 느립니다. 나는 당신이 작성한 테스트 코드를 의미하는 것이 아니라 당신의 통제하에 있습니다. 테스트 스위트, 단일 테스트 등을 실행하든 이러한 테스트를 실행하는 프레임 워크는 느립니다.
  • 여러 개발자가 작업 (예 : 메타 데이터 등을 다시 생성) 할 때 항상 문제를 일으키는 테스트 메타 데이터 파일을 보관해야합니다. 다른 모든 테스트 스위트에는 메타 데이터 파일이 필요하지 않습니다. 테스트를 구성하는 것은 좋지만 네임 스페이스, 클래스 및 메서드 이름을 통해 동일한 결과를 얻을 수 있습니다.
  • 지속적 통합을 수행하고 빌드 머신에서 단위 테스트를 실행하려면 해당 머신에 Visual Studio를 설치해야합니다.

즉, 8 개월 전에 다시 결정해야한다면 아마도 NUnit을 택할 것입니다. 통합 된 테스트 결과 보고서가 없을 수도 있지만 개발자는 더 원활한 테스트 경험을 가질 수 있습니다.


6
+1, 선택의 여지가없는 한 MSTest를 피하십시오. 다양한 오픈 소스 프레임 워크가 더 좋습니다 (xUnit, NUnit, MbUnit 등).
Brannon

49

다음은 MS Test에 대한 나의 경험입니다.

  • 우리는 약 3800 Test로 MS Test를 실행하고 있습니다.
  • 테스트가 실행을 시작하는 데는 매우 오래 걸리며 단일 테스트를 실행할 때 고통 스럽습니다.
  • 테스트를 실행하려면 약 1GB 메모리가 필요합니다. 아니요, 테스트의 메모리 누수로 인한 것이 아닙니다. 자주 OutOfMemoryExceptions가 발생합니다.
  • 그렇게 많은 리소스를 사용하기 때문에 배치 파일에서 테스트를 실행하기 시작했습니다. 그렇다면 전체 통합은 어떤 이점이 있습니까?
  • 버그가 있고 불안정합니다.
    • 예를 들어 테스트에서 [Ignore] 속성을 제거하면 테스트에 대한 정보를 어딘가에 캐시하기 때문에 인식하지 못합니다. 때때로 문제를 해결하는 테스트 목록을 새로 고치거나 VS를 다시 시작해야합니다.
    • 참조 어셈블리를 out 디렉터리에 임의로 복사하지 않습니다.
    • 배포 항목 (사용할 추가 파일)이 제대로 작동하지 않습니다. 무작위로 무시됩니다.
  • vsmdi 및 testrunconfig 파일에 숨겨진 (테스트 코드에는 표시되지 않음) 정보가 있습니다. 신경 쓰지 않으면 작동하지 않을 수 있습니다.
  • 기능적으로 NUnit과 비슷할 수 있지만 VS 테스터 에디션을 사용하는 것을 고려하면 비용이 많이 듭니다.

추가 : 우리는 지금 더 많은 테스트를 가지고 있습니다. 얼마나 많은지 말할 수 없습니다. OutOfMemoryExceptions 및 기타 불안정성 문제로 인해 Visual Studio에서 더 이상 모두 실행할 수 없습니다. 스크립트에서 테스트를 실행합니다. Visual Studio에서 테스트 결과를보기는 쉽지만 솔루션이 열리면 VS가 충돌합니다 (매번). 따라서 텍스트 검색을 사용하여 실패한 테스트를 검색해야합니다. 더 이상 통합 도구의 이점이 없습니다.


또 다른 업데이트 : 현재 VS 2013을 사용하고 있습니다. 많은 것들이 바뀌 었습니다. 그들은 우리가 시작한 이래 세 번째로 MS 테스트 실행기를 다시 작성했습니다. 이로 인해 많은 주요 변경 사항이 발생했지만 새 버전은 더 나은 결과를 얻지 못했습니다. MS Test의 멋진 기능이 더 이상 지원되지 않기 때문에 사용하지 않아서 다행입니다. 정말 부끄러운 일입니다. 우리는 여전히 스크립트를 사용하여 모든 단위 테스트를 빌드하고 실행하고 있습니다. Visual Studio는 테스트 실행을 시작하는 데 몇 분이 걸렸습니다 (컴파일 후 첫 번째 테스트가 시작될 때까지의 시간 측정). 그들은 아마도 업데이트로 그것을 고칠 것이고 이것은 우리 프로젝트의 특정 문제 일 수 있습니다. 그러나 Resharper는 동일한 테스트를 실행할 때 훨씬 더 빠릅니다.

결론 : 적어도 Resharper와 함께 사용하면 MS Test가 유용합니다. 그리고 그들이 마침내 테스트 러너가 어떻게 작성되어야하는지 알아 내고 다음에 Visual Studio를 업데이트 할 때 이런 종류의 주요 변경 사항을 수행하지 않기를 바랍니다.


나는 최근, 디버깅없이 실행 시작이있게 한 훨씬 빠르고 훨씬 더 NUnit과이 어떻게 사용되는지와 같은,하지만 여전히 짜증나입니다. 성능 저하는 Visual Studio가 디버깅 할 때 펑키 한 작업을 수행하는 것과 관련이있는 것 같습니다. (- 당신은 여전히 VS와 함께 좋은 "통합"을 얻을 그게 아니라 그냥 "F5"보다 사용 "Ctrl + F5"입니다)
Arafangion

좋은 답변, 내 시간을 저장
FindOutIslamNow

18

NUnit를 사용할 수 있습니다 함께 비주얼 스튜디오와. 별도의 프로그램이 아닌 프레임 워크입니다. 그래서 당신은 그것이 당신에게 맞는지 살펴볼 수 있습니다 :).

대체 텍스트 http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

"플러그인을 설치하면 도구 메뉴 아래에 새로운 하위 메뉴가 있습니다."

가져 오기에 대한 자세한 내용 은 http://nunitit.codeplex.com/ 을 참조하십시오 .

또한 SO 검색을 사용하여 많은 것을 찾을 수 있습니다. 이 주제 는 예를 들어 MS 표준 테스트에 비해 NUnit의 장점을 나열합니다.



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


그래서 당신은 nunit이 Microsoft 단위 테스트 프레임 워크 이외의 것을 가져 오지 않는다는 것을 의미합니까?
Tim

예를 들어 내 게시물 (위)에서 내 링크를 참조하십시오.
bastijn 09

저는 NUnit을 사용하고 있고 Microsoft의 단위 테스트 프레임 워크에 대해 잘 모르기 때문에 더 나은 것이 무엇인지 말할 수 없습니다. 나는 당신이 여기에서 차이점에 대한 몇 가지 주제를 찾을 수있는 좋은 기회가 있다고 생각합니다.
Oliver Hanappi

다른 인수를 사용하여 하나의 테스트 방법을 실행하기위한 [TestCase], [Theory]와 같은 몇 가지 유용한 구성을 제공합니다. 또한 어설 션에 대한 매우 유창한 구문을 지원합니다. 그리고 마지막으로 MSTest보다 훨씬 광범위하게 사용되므로 문제가 발생하면 지원 / 정보를 얻을 수있는 기회가 더 많습니다.
elder_george 09-10-12

0

에서는 NUnit과 , 테스트를 병렬로 실행되지 않는다. 오히려 모든 테스트가 단일 스레드에서 실행되는 것처럼 보입니다. MSTest에서 각 테스트는 별도의 스레드에서 인스턴스화되므로 실행이 인터리브됩니다. 따라서 테스트 A가 성공 여부를 테스트 B에 의존하는 경우 테스트 A가 실행 중일 때 테스트 B가 실행되기 시작할 가능성이 높으므로 실패 할 가능성이 높습니다.


-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.