Модульное тестирование метода, который создает таблицу с индексами - PullRequest
0 голосов
/ 07 ноября 2019

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

public class IndexTests : DataAccessFixture
{
    [Test]
    public void CreateTableWithIndex()
    {
        var db = this.database.Create();
        var table = db.DefineTable("IndexedTable");

        table.Columns.Add("Id", FieldType.Guid, false, true);
        table.Columns.Add("CustomerNumber", FieldType.VarChar, 50);
        table.Columns.Add("Name", FieldType.VarChar, 50);

        table.Indices.Add("IX_Name", false, "Name");
        table.Indices.Add("IX_CustomerNumber", true, "CustomerNumber");

        db.Execute();

        this.database.DropTable(table.Name);
    }
}

1 Ответ

0 голосов
/ 07 ноября 2019

Прежде всего вам следует избегать наличия поля database в вашем тестовом классе. Это может помешать другим тестам, которые могут выполняться одновременно с использованием одного и того же объекта, который может или не может повлиять на ваши результаты (но, вероятно, будет).

Какой из ваших поддельных БД? Поле database или результаты database.Create()? Если последнее так, то ваш тест на самом деле просто проверяет ваш поддельный код, а не код продукта.

Поскольку неясно, используете ли вы пользовательские типы или bclтипы Я просто пойду и предположу, что вы тестируете свои пользовательские типы. Если database, db и table на самом деле bcl типа , читать далее не нужно. Нет смысла тестировать эти классы. При этом, что именно db.Execute() делает?

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

[Test]
public void DefineTableDoesNotThrow() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = null;

    // act & assert
    Assert.DoesNotThrow(() => table = db.DefineTable("IndexedTable"));

    // clean up
    database.DropTable("IndexedTable");

}
[Test]
public void DefineTable() {

    // arrange
    var database = // create your instance here
    var db = database.Create();

    // act
    var table = db.DefineTable("IndexedTable");

    // assert
    // check if your table was created and exists.
    // do not care about the actual columns in here.

    // clean up
    database.DropTable("IndexedTable");

}

Затем вы хотите проверить, созданы ли ваши столбцы так, как вы этого хотите. Это еще одна функциональность, так что это должен быть еще один тест. Он работает так же, как DefineTable, когда вы хотите убедиться, что сначала он не генерирует исключения, а затем беспокоитесь о том, работает ли он правильно.

[Test]
public void ColumnAddDoesNotThrow() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = db.DefineTable("IndexedTable");

    // act & assert
    Assert.DoesNotThrow(() => table.Columns.Add("Id", FieldType.Guid, false, true));

    // clean up
    database.DropTable("IndexedTable");

}
[Test]
public void ColumnAdd() {

    // arrange
    var database = // create your instance here
    var db = database.Create();
    var table = db.DefineTable("IndexedTable");

    // act
    table.Columns.Add("Id", FieldType.Guid, false, true);

    // assert
    // check if your table now has the correct column

    // cleanup
    database.DropTable("IndexedTable");

}

Следующее, что лучше всего сделать, это сделатьэтот последний тест использовать несколько входов. Это позволяет вам тестировать крайние случаи с одним и тем же кодом, просто добавив еще одну строку кода. Украсьте тест с помощью [TestCaseAttribute(...)] и добавьте необходимые параметры в ваш метод теста. Это должно быть сделано для каждой возможной перегрузки table.Column.Add(...). Само собой разумеется, что это относится и к table.Indices.Add(...).

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