Независимость метода модульного тестирования - PullRequest
2 голосов
/ 05 августа 2010

Итак, я не был полностью уверен, что это правда:

[TestClass]
public class UnitTest1
{
    private int i = 0;

    [TestMethod]
    public void TestMethod1()
    {
        Thread.Sleep(5000);
        Assert.IsTrue(i == 10);
    }

    [TestMethod]
    public void TestMethod2() {
        i = 10;
    }
}

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

Кроме того, я должен определить

    [TestCleanup]
    public void Test_Cleanup() {
        engine = null;
    }

из-за этого

    [TestInitialize]
    public void Test_Initialize()
    {
        var pieceGeneratorMock = new Mock<IPieceGenerator>();
        pieceGeneratorMock.Setup(pg => pg.Generate())
            .Returns(new Piece(Color.Red));
        IPieceGenerator pieceGenerator = pieceGeneratorMock.Object;

        Size size = new Size(4, 4);
        BackgroundBoard backgroundBoard = new BackgroundBoard(size);
        PieceBoard pieceBoard = new PieceBoard(size);
        engine = new Engine(pieceGenerator, backgroundBoard, pieceBoard);
    }

?

Ответы [ 5 ]

4 голосов
/ 05 августа 2010

В JUnit, по крайней мере, каждый метод тестирования вызывается для отдельного экземпляра вашего TestCase.Вы можете убедиться в этом сами, выдав / зарегистрировав хэш идентификатора this в каждом методе test *.

3 голосов
/ 06 августа 2010

Вы можете использовать глобальные переменные внутри тестовых классов.Существует фундаментальный принцип, согласно которому каждый тест, который вы пишете, должен быть независимым.В идеале не должно быть зависимостей между двумя методами испытаний.Если вы хотите использовать глобальные переменные, вы можете инициализировать их внутри метода, который украшен атрибутом [TestInitialize].Этот метод вызывается каждый раз перед выполнением любого метода теста, который имеет атрибут [TestMethod].

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

0 голосов
/ 05 августа 2010

Вы можете и должны использовать методы setUp и tearDown для инициализации и очистки до и после ваших тестов.

Тем не менее, я думаю каждый тест выполняется на своем собственном объекте; т.е. для каждого выполнения теста есть новый объект UnitTest1.

0 голосов
/ 05 августа 2010

Вы не разветвляете TestMethod1 (), поэтому весь поток ожидает окончания периода ожидания, выполняет assert и находит его ложным, поскольку поток не достиг TestMethod2

ответьте на ваш вопрос, оба метода могут читать и писать я.

0 голосов
/ 05 августа 2010

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

TestCleanup и TestInitialize не нужны из-за друг друга, их можно использовать вместе или исключительно взаимно. TestInitialize будет запускаться перед каждым тестом, TestCleanup будет запускаться после каждого теста (но до Testinitialize). Довольно прямо вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...