programing tip

기본 생성자 대신 TestFixtureSetUp 특성을 언제 사용합니까?

itbloger 2020. 11. 5. 07:46
반응형

기본 생성자 대신 TestFixtureSetUp 특성을 언제 사용합니까?


NUnit 문서는 a TestFixtureSetup함께 메소드를 사용할 때와 생성자에서 설정을 수행 할 때를 알려주지 않습니다 .

public class MyTest
{
    private MyClass myClass;

    public MyTest()
    {
        myClass = new MyClass();
    }

    [TestFixtureSetUp]
    public void Init()
    {
        myClass = new MyClass();
    }
}

TestFixtureSetup기본 생성자 대 기본 생성자 에 대한 좋은 / 나쁜 관행 이 있습니까? 아니면 차이가 없습니까?


저는 이것이 nUnit 팀이 해결하지 못한 문제 중 하나라고 생각합니다. 그러나이 정확한 문제를보고 생성자가 테스트 픽스처 초기화 에 사용하기에 좋은 것이라고 결정한 훌륭한 xUnit 프로젝트있습니다 .

NUNIT를 들어,이 경우 내 가장 좋은 방법은 사용하는 것이 었습니다 TestFixtureSetUp, TestFixtureTearDown, SetUp, 및 TearDown문서에 설명 된대로 방법을.

nUnit 테스트 픽스쳐를 일반 클래스로 생각하지 않을 때도 도움이된다고 생각합니다. 나는 그것들을 고정물이라고 생각하고, 그것은 나를 정신적 장애물을 극복하고이 문제를 간과 할 수있게합니다.


테스트 클래스에서 생성자를 사용해야하는 이유는 무엇입니까?

내가 사용하십시오 [SetUp][TearDown]코드에 대한 표시 방법은 이전과 각각의 테스트 후에 실행과 유사합니다 [TestFixtureSetUp][TestFixtureTearDown]이전과 고정의 모든 테스트가 실행 된 후 한 번만 실행되는 코드에 대한 방법을 표시했다.

아마도를 [TestFixtureSetUp]생성자로 대체 할 수있을 것 같지만 (내가 시도하지는 않았지만) 이것은 표시된 메서드가 제공하는 명확한 규칙에서 벗어나는 것 같습니다.


[TestFixtureSetup]생성자에서 할 수있는 작업 중 하나 [TestFixture].

테스트 픽스처를 매개 변수화하려면 적어도 일부 설정에 생성자를 사용해야합니다 . 지금까지 여러 데이터 공급자가있는 데이터 액세스 계층 테스트와 같은 통합 테스트에만 이것을 사용했습니다.

[TestFixture("System.Data.SqlClient",
  "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))]
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])]
internal class MyDataAccessLayerIntegrationTests
{
    MyDataAccessLayerIntegrationTests(
        string dataProvider,
        string connectionString)
    {
        ...
    }
}

나는 [TestFixtureSetUp]똑같은 일을하는 간단하고 잘 이해 된 일류 언어 구조가 있다는 점을 감안할 때 무엇이 필요한지 종종 궁금해했습니다 .

내가 선호하는 것은 생성자를 사용하여 멤버 변수를 다시 초기화 할 수 없도록 readonly 키워드를 활용하는 것입니다.


생성자와 [TestFixtureSetUp]속성이 표시된 메서드에는 차이가 있습니다 . NUnit 문서에 따르면 :

NUnit은 세션 과정에서 객체를 여러 번 생성 할 수 있으므로 생성자에는 부작용이없는 것이 좋습니다.

따라서 값 비싼 초기화가있는 경우를 사용하는 것이 좋습니다 TestFixtureSetUp.


[TestFixtureSetUp][TestFixtureTearDown]전체 테스트 클래스를위한 것입니다. 한 번만 실행됩니다.

[SetUp]그리고 [TearDown]각 시험 방법 (시험)에 대해이다. 모든 테스트에 대해 실행됩니다.


생성자와 TestFixtureSetUp의 중요한 차이점은 적어도 NUnit 2에서 생성자 코드는 테스트 실행뿐 아니라 테스트 열거에서 실제로 실행되므로 기본적으로 ctor 코드를 읽기 전용, 즉 매개 변수 값만 채우도록 제한하고 싶습니다. 부작용을 일으키거나 실제 작업을 수행하는 모든 것은 Lazy로 래핑되거나 TestFixtureSetUp / OneTimeSetUp에서 수행되어야합니다. 따라서 생성자는 테스트를 구성하는 장소로만 생각할 수 있습니다. TestFixtureSetUp은 테스트가 실행되기 전에 시스템의 필수 초기 상태 인 테스트 픽스처가 초기화되는 곳입니다.


나는 부정적인 좋은 대답을 가지고 있다고 생각합니다. 속성 대신 생성자를 사용하는 이유는 테스트 클래스 사이에 상속이있을 때입니다.

Only one method annotated with [TestFixtureSetup] will be called (on the concrete class only), but the other fixture initializers will not. In this case I'd rather put the initialization in the constructor, which has a well-defined semantics for inheritance :)


The constructor and the SetUp methods are used differently:
The constructor is run only once.
However, the SetUp methods are run multiple times, before every test case is executed.

참고URL : https://stackoverflow.com/questions/212718/when-do-i-use-the-testfixturesetup-attribute-instead-of-a-default-constructor

반응형