티스토리 뷰

1. Naming your tests

테스트의 의도를 명시적으로 표현하기위해 테스트의 이름은 다음 세 부분으로 구성되어야 합니다.

a. 테스트할 메서드의 이름

b. 테스트 중인 시나리오

c. 시나리오에서 호출될 때 예상되는 동작 결과

테스트는 단순히 코드가 동작하는지 확인하는 것 이상으로, 테스트 코드를 살펴봄으로써 코드의 동작을 유추할 수 있어야합니다.

Bad:

fun test_Single() {
  var stringCalculator = StringCalculator()
  
  var actual = stringCalculator.add("0")
  
  assertEquals(0, actual)
}

Better:

fun add_SingleNumber_ReturnsSameNumber() {
  var stringCalculator = StringCalculator()
  
  var actual = stringCalculator.add("0")
  
  assertEquals(0, actual)
}

 

2. Arranging your tests

테스트 작성시, Arrange, Act, Assert 세가지 주요 작업으로 구성합니다

Arrange - 필요한 개체를 정렬하고 필요에 따라 만들고 설정합니다 (mock, stub, spy 등)

Act - 테스트할 메서드를 동작합니다

Assert - 동작 결과와 예상 결과를 어설션 합니다.

가독성은 테스트를 작성할 때 가장 중요한 측면 중 하나입니다. 테스트 내에서 이러한 작업을 각각 구분하면 코드를 호출하는 데 필요한 종속성, 코드 호출 방법 및 어설션하려는 대상이 명확하게 강조 표시할 수 있습니다

Bad:

fun add_EmptyString_ReturnsZero() {
    // Arrange
    var stringCalculator = StringCalculator()

    // Assert
    assertEquals(0, stringCalculator.add(""))
}

Better:

fun add_EmptyString_ReturnsZero() {
    // Arrange
    var stringCalculator = StringCalculator()

    // Act
    var actual = stringCalculator.add("")

    // Assert
    assertEquals(0, actual)
}

 

3. Avoid magic strings

테스트를 작성할 때는 가능한 한 많은 의도를 표현하는 것을 목표로 해야 합니다.

Bad:

fun add_BigNumber_ThrowsException() {
    var stringCalculator = StringCalculator()

    Action actual = stringCalculator.add("1001")

    assertThrows<OverflowException>(actual)
}

Better:

fun add_BigNumber_ThrowsException() {
    var stringCalculator = StringCalculator()
    val MAXIMUM_RESULT = "1001";

    Action actual = stringCalculator.add(MAXIMUM_RESULT)

    assertThrows<OverflowException>(actual)
}

 

4. Avoid logic in tests

단위 테스트를 작성할 때  ifwhileforswitch 등의 논리 조건을 사용하지않습니다.

논리식에 의한 버그가 발생할 가능성이 있습니다. 테스트 코드는 높은 수준의 확신이 있어야합니다.

논리식 사용이 불가피한 경우, 테스트를 두 개 이상의 다른 테스트로 분할하는 것이 좋습니다.

Bad:

fun add_MultipleNumbers_ReturnsCorrectResults() {
    val stringCalculator = StringCalculator()
    
    var expected = 0
    val testCases = listOf<String>(
            "0,0,0",
            "0,1,2",
            "1,2,3"
    )
        
    for( test in testCases) {
        assertEquals(expected, stringCalculator.add(test));
        expected += 3;
    }
}

Better:

fun add_MultipleNumbers_ReturnsCorrectResults(input: String, expected: Integer) {
    val stringCalculator = StringCalculator()
    
    val actual = stringCalculator.add(input)
    
    assertEquals(expected, actual)
}

 

reference

Unit testing best practices with .NET Core and .NET Standard - Microsoft

댓글