#c# #java #unit-testing
#c# #java #модульное тестирование
Вопрос:
В настоящее время я использую следующий фрагмент кода для инициализации некоторых модульных тестов в классе:
[TestClass]
public class BoardTests_SquarePieceFalling
{
private Engine engine;
private BackgroundBoard backgroundBoard;
private PieceBoard pieceBoard;
private IFallingPieceFactory GetFallingPieceFactory(FallingPiece fallingPieceToReturn)
{
var factory = new Mock<IFallingPieceFactory>();
factory.Setup(f => f.Generate()).Returns(fallingPieceToReturn);
return factory.Object;
}
private void TestInitializer(Color pieceColor, Size boardSize) {
backgroundBoard = new BackgroundBoard(boardSize);
pieceBoard = new PieceBoard(boardSize);
var fallingPiece = new FallingPiece(new SquarePiece(), pieceColor, boardSize.Width);
var fallingPieceFactory = GetFallingPieceFactory(fallingPiece);
var currentFallingPiece = new CurrentFallingPiece(fallingPieceFactory);
var fallingPieceMovementEvaluator = new FallingPieceMovementEvaluator(backgroundBoard, currentFallingPiece, boardSize);
engine = new Engine(backgroundBoard, pieceBoard, currentFallingPiece, fallingPieceMovementEvaluator);
}
...Unit-Tests are below
[TestMethod]
public void When_Square_Hits_The_Ground_Another_One_Starts_Falling_From_The_Top()
{
TestInitializer(Color.Red, new Size(2, 7));
engine.Tick(10);
..Asserts..
}
...
}
Я думаю, что в настоящее время у меня слишком много методов тестирования в этом классе. Я также считаю, что они охватывают много областей, поэтому я хотел бы разделить их на меньшие тестовые классы.
Мои вопросы:
-
На данный момент это лучший способ инициализации тестов? Я знаю, что могу использовать аннотацию [TestInitialize], но это не позволяет мне передавать параметры для инициализации полей, которые я захочу использовать, не так ли?
-
Я собираюсь разделить текущий тестовый класс на 2-3 меньших тестовых класса. Моя текущая идея состоит в том, чтобы создать базовый тестовый класс, в котором находится логика инициализации, а затем сделать так, чтобы все эти новые классы наследовали от него. Единственное различие, которое я вижу, это необходимость помещать
Engine
,BackgroundBoard
иPieceBoard
как защищенные поля. Хорошая ли это идея? -
Как вы обычно справляетесь с модульными тестами, которые очень похожи, но которые обычно всегда имеют по крайней мере 1 другое поле настройки? Я имею в виду, что во многих моих модульных тестах у меня одно и то же
Engine
,BackgroundBoard
PieceBoard
FallingPiece
CurrentFallingPiece
,FallingPieceFactory
и т.д. и т.п., Но обычно одна или две из этих вещей различны для каждого теста. Я обошел проблему, определивTestInitializer()
метод с нужными мне параметрами в каждом тесте, но мне остается гадать, есть ли какой-либо другой способ сделать это.
Спасибо
Ответ №1:
Как правило, проще всего иметь один тестовый класс (файл) для каждого тестируемого класса.
Итак, у вас должен быть EngineTest
, BackgroundBoardTest
и т.д.
Ответ №2:
Я не вижу никаких проблем с тем, что вы делаете. Возможно, вы захотите это проверить: http://xunitpatterns.com/Parameterized Test.html