내용으로 건너뛰기
MS 테스트에서 개인 메서드를 단위 테스트하는 방법

MS 테스트에서 개인 메서드를 단위 테스트하는 방법

시작하기 전에 MS 테스트를 사용하여 개인 메서드를 단위 테스트하는 방법은 무엇입니까? 개인 메서드를 테스트하는 것이 좋은지 아닌지 논의해 보겠습니다.

4min read

저는 종종 두 가지 생각의 학파가 있다는 것을 보았습니다.

  1. private 메소드를 테스트해야 합니다.
  2. 프라이빗 메서드는 테스트하면 안 됩니다.

이러한 관점을 갖기 위해 아래 목록과 같이 SUT(System under Test) 급여 클래스를 고려해 보겠습니다.

namespace Calculator
{
    public class Salary
    {
        public int CalculateSal(int bs, int nwd)
        {
             int ts ;

             if(isValidNwd(nwd))
             {
                 ts= bs*nwd;
             }
             else
             {
                 ts = 1000;
             }
             return ts;
        }

        private bool isValidNwd(int nwd)
        {
            if (nwd > 8)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

테스트 중인 시스템 Salary 클래스에는 두 가지 기능이 있습니다.

  1. CalculateSal 메서드는 공용 메서드이며 두 개의 매개 변수를 사용하여 급여를 계산합니다
  2. isValidwd 메서드는 private 메서드이며 하나의 매개 변수를 사용합니다. 이 함수는 근무일 수가 8보다 크면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
  3. CalculateSal 메서드는 먼저 private 메서드 isValidWd를 사용하여 작업일 수가 유효한지 여부를 확인합니다.
  4. 근무일수가 유효한 경우 급여는 기본급과 근무일수를 곱하여 계산되거나 그렇지 않으면 $1000로 고정됩니다.

이제 두 가지 기능이 있는 Salary 클래스를 테스트할 수 있습니다.

테스트 중인 시스템이 있습니다 두 가지 기능을 가진 급여 클래스

한 가지 의견은 private 메소드를 별도로 단위 테스트해서는 안된다는 것입니다. 이는 private 메소드가 public 메소드 내에서 사용되며 public 메소드의 동작을 테스트할 때 private 메소드의 동작도 테스트되기 때문입니다.

또 다른 의견은 private 메소드가 다른 public 또는 private 메소드와 격리되어 자체 동작에 대해 단위 테스트를 거쳐야한다는 것입니다. private 메서드를 테스트하는 방법을 살펴보기 전에 이 문제를 해결할 수 있는 다른 가능한 방법이 있는지 몇 가지 생각해 보겠습니다.

Violating Single Responsibility Principle

현재 테스트 중인 시스템 Salary 클래스는 두 가지 책임이 있기 때문에 단일 책임 원칙을 위반하고 있습니다.

  1. 급여를 계산하려면(공개 방법)
  2. 근무일 수를 확인하려면(private 방법)
테스트 중인 시스템 급여 등급은 두 가지 책임이 있기 때문에 단일 책임 원칙을 위반하고 있습니다

 

클래스의 validate working days 동작을 테스트하지 않는 한 SUT Salary 클래스의 좋은 코드 적용 범위를 확신 할 수 없으며 설계상 비공개입니다. 좋은 옵션은 다음과 같습니다 : Salary 클래스를 만드는 동안 급여를 계산하고 근무일을 검증하는 공개 메소드를 사용하여 두 개의 별도 클래스로 책임을 분할 할 수 있습니다. 그런 다음 두 클래스의 공용 메서드에 대한 단위 테스트를 작성할 수 있습니다. 그 방법을 봅시다.

Private 메소드에 대한 단위 테스트 작성

SUT 클래스의 private 메소드를 테스트해야한다고 생각한다면 두 가지 옵션이 있습니다.

  1. 리팩토링을 사용하십시오 – 그러나 이것은 약간 복잡합니다.
  2. VSTS PrivateObject 클래스 사용 – 간단합니다!
SUT 클래스의 private 메소드를 테스트해야한다고 생각한다면 두 가지 옵션이 있습니다

PrivateObject 클래스를 사용하여 private 메소드의 단위 테스트를 수행하는 방법을 살펴보겠습니다. private 객체 클래스를 사용하려면 다음을 수행해야합니다.

  1. 테스트 프로젝트에서 Microsoft.VisualStudio.QualityTools.UnitTestFramework의 참조를 추가합니다. unit test project templet를 선택하여 프로젝트를 만든 경우 이 참조는 기본적으로 프로젝트에 추가됩니다.
  2. Add a namespace Microsoft.VisualStudio.TestTools.UnitTesting.

PrivateObjectClass의 생성자는 type을 매개 변수로 사용하므로 여기서는 SUT Salary 클래스의 type을 전달한 다음 PrivateObjectClass의 개체에서 invoke 메서드를 호출하여 private 메서드를 호출해야 합니다.

아래 목록과 같이 private 메소드 isValidNwd를 테스트할 수 있습니다.

[TestMethod] 
public void ReturnTrueForValidWorkingDays() {
    PrivateObject objToTestPrivateMethod=new PrivateObject(typeof(Salary));
    bool result=Convert.ToBoolean(objToTestPrivateMethod.Invoke("isValidNwd", 6));
    Assert.AreEqual(result, true);
}

기본적으로 다음과 같은 작업을 수행하고 있습니다.

·         PrivateObject 클래스의 객체 만들기

·         Salary 클래스 유형을 생성자에서 입력 매개 변수로 전달

·         invoke 메서드를 사용하여 SUT Salary 클래스의 private 메서드 실행

·         invoke 메소드에 두 개의 매개 변수 전달: 첫 번째 매개 변수는 private 메소드의 이름이고 두 번째 매개 변수는 실행하는 동안 private 메소드에 전달될 인수입니다.

이것이 바로 우리가 개인 메소드를 단위 테스트하는 방법입니다!

결론

이 게시물에서 우리는 다음에 대해 배웠습니다.

  • private 메소드를 테스트할지 여부
  • PrivateObject 클래스를 사용하여 private 메서드를 테스트하는 방법

이 게시물이 도움이 되었기를 바랍니다 – 읽어 주셔서 감사합니다. 즐거운 코딩 되세요!

데모 요청