단위 테스트에 대한 인기있는 명명 규칙은 무엇입니까? [닫은]


203

일반

  • 모든 테스트에 대해 동일한 표준을 따르십시오.
  • 각 테스트 상태가 무엇인지 명확히하십시오.
  • 예상되는 행동에 대해 구체적으로 설명하십시오.

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

출처 : 단위 테스트의 명명 표준

2) 밑줄로 각 단어 분리

Public void Sum_Negative_Number_As_1st_Param_Exception_Thrown() 

Public void Sum_Negative_Number_As_2nd_Param_Exception_Thrown () 

Public void Sum_Simple_Values_Calculated ()

다른

  • Test를 사용하여 종료 메소드 이름
  • 클래스 이름으로 메소드 이름 시작

행동 중심 개발을 참조하십시오 .
웨지

답변:


94

나는이 한 사람에 대해 당신과 거의 비슷합니다. 사용한 명명 규칙은 다음과 같습니다.

  • 각 테스트 상태가 무엇인지 분명히하십시오.
  • 예상되는 행동에 대해 구체적입니다.

시험 명에서 더 필요한 것이 있습니까?

Ray의 답변과 달리 Test 접두사가 필요 하다고 생각하지 않습니다 . 테스트 코드입니다. 코드를 식별하기 위해이 작업을 수행해야하는 경우 더 큰 문제가있는 경우 테스트 코드를 프로덕션 코드와 섞어서는 안됩니다.

밑줄의 길이와 사용에 관해서는, 테스트 코드 는 누구를 걱정합니까? 읽을 수 있고 테스트가 수행중인 작업에 대해 분명한 한 귀하와 귀하의 팀만이이를 볼 수 있습니다. :)

즉, 나는 여전히 내 모험 을 테스트하고 블로깅하는 것에 매우 익숙합니다. :)


20
"읽기 쉽고 명확하게"그리고 "누가 ... 신경 쓰는 한"약간의 모순. 글을 읽을 수없고 명확하지 않은 사람은 누구나 관심을 갖기 때문에 중요한 이유입니다. :-)
David Victor

1
접두사에 대한 하나의 추가 인수. IDE에서 파일을 검색 할 때 Test클래스 이름 으로 시작하여 테스트 사례를 쉽게 검색 할 수 있습니다 . 클래스 이름과 테스트 클래스 이름이 동일하면, 우리가 항상 일시 중지하고 두 파일의 경로를 읽을해야 할 것
이 사용자는 HELP NEEDS

@ THISUSERNEEDSHELP src / libs & src / tests 와 같은 좋은 폴더 구조를 가짐으로써 귀하의 요점을 쉽게 극복 할 수 있다고 생각합니다 . 나는 몇 가지 테스트 러너 프레임 워크와 같은 접두사를 필요로 할 알고 시험 때문에 이러한 경우는 피할 수없는 것, 테스트 코드 식별을 위해,하지만 나머지는 반복 될 수 없는 요구 접두사.
negrotico19

@ negrotico19 IntelliJ와 같은 경우 Search Everywhere(shift shift) 또는 Find a Class By Name(CMD O)를 생각하고 있습니다. 나는 그것이 것을 얻을 중 하나 폴더 구조 또는 모듈 구조에 의해 구별 될 수 있지만, 우리가 무언가를 검색 할 때, 우리는 이미 우리가 검색 할 것을 알고있다. 예를 들어, 테스트를 test찾는 경우 이름을 검색하는 대신 검색을 제한 한 다음 이름을 검색 한 다음 눈으로 수동으로 테스트 필터링 하려고합니다 . 작은 차이이지만 "[클래스 이름]"을 테스트하고 팝업이 하나만 있고 정신 부하를 줄이는 것이 훨씬 쉽습니다.
이 사용자의 요구

37

이것 또한 읽을 가치가 있습니다 : 구조화 단위 테스트

이 구조에는 테스트중인 클래스 당 테스트 클래스가 있습니다. 그렇게 드문 일이 아닙니다. 그러나 나에게 특이한 점은 테스트 할 각 방법마다 중첩 클래스가 있다는 것입니다.

예 :

using Xunit;

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void Name_AppendsTitle()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void MaleNames_AppendsSir()
        {
            // Test code
        }

        [Fact]
        public void FemaleNames_AppendsDame()
        {
            // Test code
        }
    }
}

그리고 여기에 이유가 있습니다 :

우선 테스트를 체계적으로 정리할 수있는 좋은 방법입니다. 분석법에 대한 모든 테스트 (또는 사실)가 함께 그룹화됩니다. 예를 들어, CTRL + M, CTRL + O 단축키를 사용하여 분석법 본문을 축소하면 테스트를 쉽게 스캔하고 코드 사양처럼 읽을 수 있습니다.

나는 또한이 접근법을 좋아합니다 :

MethodName_StateUnderTest_ExpectedBehavior

아마도 다음과 같이 조정하십시오.

StateUnderTest_ExpectedBehavior

각 테스트는 이미 중첩 클래스에 있기 때문에


2
Visual Studio에서 Resharper의 테스트 러너를 사용하는 사람들은 8.x의 중첩 테스트 클래스를 사용하여 버그를 수정했습니다. 그 이후로 이것은 내가 선호하는 구조가되었습니다.
angularsen

MethodName_StateUnderTest_ExpectedBehavior 접근 방식으로 이름이 실제로 길어질 수 있습니까? "InitializeApiConfiguration_MissingApiKey_IllegalArgumentException"과 같은. 이것이 실제로 좋은 테스트 이름입니까?
Portfoliobuilder

28

MethodName_DoesWhat_WhenTheseConditions예를 들어 다음 과 같은 규칙을 사용하는 경향이 있습니다 .

Sum_ThrowsException_WhenNegativeNumberAs1stParam

그러나 내가 많이 보는 것은 테스트 이름이 단위 테스트 구조를 따르도록 만드는 것입니다.

  • 가지런 히하다
  • 행위
  • 주장

또한 다음의 BDD / Gherkin 구문을 따릅니다.

  • 주어진
  • 언제
  • 그때

다음과 같은 방식으로 테스트 이름을 지정합니다. UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

예를 들어 :

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

그러나 테스트 할 메소드 이름을 먼저 입력하는 것이 좋습니다. 테스트는 알파벳순으로 정렬되거나 VisStudio의 멤버 드롭 다운 상자에 알파벳순으로 정렬되어 표시 될 수 있으며 1 개의 메소드에 대한 모든 테스트가 함께 그룹화되기 때문입니다.


어쨌든, 나는 모든 단어 와 달리 테스트 이름 의 주요 섹션 을 밑줄로 분리하는 것을 좋아합니다 . 왜냐하면 테스트 포인트를 더 쉽게 읽고 읽을 수 있다고 생각하기 때문입니다.

즉, 내가 좋아하는 : Sum_ThrowsException_WhenNegativeNumberAs1stParam보다 나은 Sum_Throws_Exception_When_Negative_Number_As_1st_Param.


22

밑줄이나 구분 기호없이 "PascalCasing"을 사용하는 다른 방법과 마찬가지로 테스트 방법의 이름을 지정합니다. 메소드에 대한 접미사 테스트 를 생략하고 값을 추가하지 않습니다. 메소드가 테스트 메소드라는 것은 TestMethod 속성으로 표시됩니다 .

[TestMethod]
public void CanCountAllItems() {
  // Test the total count of items in collection.
}

각 테스트 클래스는 다른 클래스 하나만 테스트해야하기 때문에 클래스 이름을 메소드 이름에서 제외합니다. 테스트 메소드를 포함하는 클래스 이름은 "Tests"라는 접미사가 붙은 테스트중인 클래스와 같은 이름을 갖습니다.

[TestClass]
public class SuperCollectionTests(){
    // Any test methods that test the class SuperCollection
}

예외 또는 불가능한 동작을 테스트하는 메소드의 경우 테스트 메소드 앞에 Cannot 단어를 붙 입니다.

[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
  // Cannot add the same object again to the collection.
}

내 이름이 바뀌는 것은 Bryan Cook의 "TDD 팁 : 테스트 명명 규칙 및 지침" 기사를 기반으로합니다 . 이 기사가 매우 유용하다는 것을 알았습니다.


1
내 게시물에 대한 링크는 +1입니다. 테스트에서 "테스트"접두사를 사용할 필요는 없습니다. 테스트에서 예상되는 동작을 지정해야합니다. 예를 들면 다음과 같습니다. CanRetrieveProperCountWhenAddMultiingItems ()
bryanbcook

2
그것은 예상 된 행동을 포함하지 않기 때문에 그것을 좋아하지 않는다
Johannes Rudolph

5

CamelCasing은 단어를 분리하고 밑줄은 명명 체계의 일부를 분리하기 때문에 첫 번째 이름 세트는 더 읽기 쉽습니다.

또한 함수 이름이나 묶는 네임 스페이스 또는 클래스에 "Test"를 포함시키는 경향이 있습니다.


2
@ 프랭크 methodName = camelCase MethodName = PascalCase
메트로 스머프

@ metro-smurf : 흥미로운 차이점, PascalCase라는 용어를 들어 본 적이 없으며 오랫동안 이런 일을 해왔습니다. PascalCase라는 용어 만 Microsoft 개발자 서클에 등장한다는 것을 알았습니다.
Frank Szczerba

Pascal Casing과 Camel Casing에 관한 역사 ( 출처 : Brad Abrams-blogs.msdn.com/brada/archive/2004/02/03/67024.aspx ) ... "Framework의 초기 디자인에서 우리는 수백 시간의 시간을 보냈습니다. 디자인 토론의 핵심 멤버 인 Anders Heilsberg (Turbo Pascal의 최초 디자이너)와 함께 케이싱 스타일로 Pascal Casing이라는 용어를 선택한 것은 놀라운 일이 아닙니다. 파스칼 프로그래밍 언어로 대중화되었습니다. "
Heliac

-3

단일 연습을 따르는 한 실제로 중요하지 않습니다. 일반적으로 메서드의 모든 변형을 다루는 메서드에 대한 단일 단위 테스트를 작성하고 (단순한 메서드가 있습니다), 메서드가 필요한 메서드에 대해 더 복잡한 테스트 집합을 작성합니다. 따라서 내 명명 구조는 일반적으로 테스트 (JUnit 3의 인수)입니다.


-8

테스트 네임 스페이스, 클래스 및 메서드에 'T'접두사를 사용합니다.

깔끔하고 네임 스페이스를 복제하는 폴더를 만든 다음 테스트 폴더를 만들거나 테스트를 위해 별도의 프로젝트를 만들고 기본 테스트를 위해 프로덕션 구조를 복제하십시오.

AProj
   Objects
      AnObj
         AProp
   Misc
      Functions
         AFunc
   Tests
      TObjects
         TAnObj
            TAnObjsAreEqualUnderCondition
      TMisc
         TFunctions
            TFuncBehavesUnderCondition

나는 무언가가 테스트라는 것을 쉽게 알 수 있습니다. 원래 코드가 어떤 것인지 정확히 알고 있습니다 (해낼 수 없다면 어쨌든 테스트가 너무 복잡합니다).

인터페이스 명명 규칙처럼 보입니다 (즉, 'I'로 시작하는 것과 혼동하지 않으며 'T'와도 혼동하지 않습니다).

테스트 유무에 관계없이 컴파일하기 쉽습니다.

어쨌든 이론 상으로는 좋으며 소규모 프로젝트에는 잘 작동합니다.


3
재미있는 접근법. 어떤 사람들은 T 접두사가 제네릭에서 사용하는 규칙 (예 : func (T1, T2, TResult))과 충돌한다고 주장 할 수 있지만 팀 내에서 합의가있는 한 개인적으로 신경 쓰지 않습니다. 이름이 짧아서 읽기도 쉽습니다.
찔린

나를 위해 너무 헝가리어 (표기법). 또한 접두사 T는 일반 유형 매개 변수에 사용됩니다.
Danny Varod

헝가리어 표기법은 더 이상 사용되지 않으며 표준 제네릭 형식 매개 변수와의 충돌로 인해이 경우 인터페이스에 적용되는 예외가 적용되지 않습니다.
SonOfPirate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.