기본 생성자 대신 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.
'programing tip' 카테고리의 다른 글
Pandas Groupby 값 범위 (0) | 2020.11.05 |
---|---|
SortedList는 무엇입니까 (0) | 2020.11.05 |
Common Lisp에서 eq, eql, equal 및 equalp의 차이점은 무엇입니까? (0) | 2020.11.05 |
Spotify 데스크톱 애플리케이션을 개발하는 데 어떤 언어 또는 기술이 사용 되었습니까? (0) | 2020.11.05 |
urllib.urlopen () 후에 close ()를 호출해야합니까? (0) | 2020.11.05 |