Как определить, кто является SUT и кто является сотрудником в модульном тестировании? - PullRequest
2 голосов
/ 22 апреля 2020

Я читал книгу, и ниже приведен код:

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    // Arrange
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var customer = new Customer();

    // Act
    bool success = customer.Purchase(store, Product.Shampoo, 5);

    // Assert
    Assert.True(success);
    Assert.Equal(5, store.GetInventory(Product.Shampoo));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    // Arrange
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var customer = new Customer();

    // Act
    bool success = customer.Purchase(store, Product.Shampoo, 15);

    // Assert
    Assert.False(success);
    Assert.Equal(10, store.GetInventory(Product.Shampoo));
}

Автор говорит Клиент это SUT и Магазин это соавтор

Я немного запутался здесь, фаза утверждения также проверяет Магазин, разве этот Магазин не является SUT?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020

SUT означает Тестируемая система , что практически означает тот объект, в отношении которого вы выполняете ваше действие .

В проверяемой фазе ваши предположения, где есть actual и expected значение. Вы проверяете фактическое против ожидаемого.


В вышеупомянутом коде Assert.Equal получает сначала ожидаемое значение, а затем фактическое. И здесь актуальная стоимость поступает из магазина. Это хорошо, потому что вызов метода Покупка указывает, что инвентарь должен уменьшиться, потому что покупка была размещена

Счастливый путь:
- При наличии инвентаря с 10 предметами
- Когда я покупаю 5 предметов
- Тогда останется 5 предметов

Несчастный путь:
- Дан инвентарь с 10 предметами
- Когда я попытаюсь купить 15 предметов
- Тогда моя покупка не удастся, и инвентарь останется как это было.

Чтобы лучше подчеркнуть намерение, вы можете переписать тест следующим образом:

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    // Arrange
    const int initialItemCount = 10;
    const int intededPurchaseCount = 5;

    var store = new Store();
    var product = Product.Shampoo;
    store.AddInventory(product, initialItemCount);
    var customer = new Customer();

    // Act
    bool isSuccess = customer.Purchase(store, product, intededPurchaseCount );

    // Assert
    Assert.True(isSuccess);
    var expectedInventoryCount = initialItemCount - intededPurchaseCount;
    Assert.Equal(expectedInventoryCount, store.GetInventory(product));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    // Arrange
    const int initialItemCount = 10;
    const int intededPurchaseCount = 15;

    var store = new Store();
    var product = Product.Shampoo;
    store.AddInventory(product, initialItemCount);
    var customer = new Customer();

    // Act
    bool isSuccess = customer.Purchase(store, product, intededPurchaseCount);

    // Assert
    Assert.False(isSuccess);
    Assert.Equal(initialItemCount, store.GetInventory(product));
}
2 голосов
/ 22 апреля 2020

Как отмечает Питер Чала, SUT означает тестируемую систему. Я вижу, как это может сбить с толку, если вы интерпретируете слово system как «расположение вещей». При такой интерпретации я вижу, как хранилище можно рассматривать как часть более широкой системы.

Однако это не тот способ, которым обычно интерпретируется термин SUT. Обычно термин обозначает единицу, с которой вы непосредственно взаимодействуете. В объектно-ориентированном программировании это обычно объект, для которого вы вызываете метод.

Обычно я называю переменные теста в соответствии с ролями , которые они играют в тесте. Таким образом, я обычно называю переменную SUT sut.

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

Следующее ближе к тому, как я написал бы тесты.

[Fact]
public void Purchase_succeeds_when_enough_inventory()
{
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var sut = new Customer();

    bool success = sut.Purchase(store, Product.Shampoo, 5);

    Assert.True(success);
    Assert.Equal(5, store.GetInventory(Product.Shampoo));
}

[Fact]
public void Purchase_fails_when_not_enough_inventory()
{
    var store = new Store();
    store.AddInventory(Product.Shampoo, 10);
    var sut = new Customer();

    bool success = sut.Purchase(store, Product.Shampoo, 15);

    Assert.False(success);
    Assert.Equal(10, store.GetInventory(Product.Shampoo));
}

Это делает однозначно ясным, какой объект является SUT. Это переменная с именем sut.

...