Организация модульных тестов

#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..
    }

    ...
}
  

Я думаю, что в настоящее время у меня слишком много методов тестирования в этом классе. Я также считаю, что они охватывают много областей, поэтому я хотел бы разделить их на меньшие тестовые классы.

Мои вопросы:

  1. На данный момент это лучший способ инициализации тестов? Я знаю, что могу использовать аннотацию [TestInitialize], но это не позволяет мне передавать параметры для инициализации полей, которые я захочу использовать, не так ли?

  2. Я собираюсь разделить текущий тестовый класс на 2-3 меньших тестовых класса. Моя текущая идея состоит в том, чтобы создать базовый тестовый класс, в котором находится логика инициализации, а затем сделать так, чтобы все эти новые классы наследовали от него. Единственное различие, которое я вижу, это необходимость помещать Engine , BackgroundBoard и PieceBoard как защищенные поля. Хорошая ли это идея?

  3. Как вы обычно справляетесь с модульными тестами, которые очень похожи, но которые обычно всегда имеют по крайней мере 1 другое поле настройки? Я имею в виду, что во многих моих модульных тестах у меня одно и то же Engine , BackgroundBoard PieceBoard FallingPiece CurrentFallingPiece , FallingPieceFactory и т.д. и т.п., Но обычно одна или две из этих вещей различны для каждого теста. Я обошел проблему, определив TestInitializer() метод с нужными мне параметрами в каждом тесте, но мне остается гадать, есть ли какой-либо другой способ сделать это.

Спасибо

Ответ №1:

Как правило, проще всего иметь один тестовый класс (файл) для каждого тестируемого класса.

Итак, у вас должен быть EngineTest , BackgroundBoardTest и т.д.

Ответ №2:

Я не вижу никаких проблем с тем, что вы делаете. Возможно, вы захотите это проверить: http://xunitpatterns.com/Parameterized Test.html