В чем разница между макетами заглушки?

Вы можете сделать это разными способами:

        int i = 123893232;
        Console.WriteLine(i.ToString());//123893232
        Console.WriteLine(Convert.ToString(i));//123893232
        Console.WriteLine(String.Format("{0:C}", i));//123 893 232,00 zł(Polish)
        Console.WriteLine(String.Format("{0:D}", i));//123893232
        Console.WriteLine(String.Format("{0:E}", i));//1,238932E+008
        Console.WriteLine(String.Format("{0:F}", i));//123893232,00
        Console.WriteLine(String.Format("{0:G}", i));//123893232
        Console.WriteLine(String.Format("{0:N}", i));//123 893 232,00
        Console.WriteLine(String.Format("{0:P}", i));//12 389 323 200,00
        Console.WriteLine(String.Format("{0:X}", i));//76275F0 
826
задан MattSayar 24 March 2016 в 17:25
поделиться

15 ответов

Заглушка

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

Макет

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

Разница между макетами и заглушками

Тесты, написанные с использованием макетов, обычно следуют инициализации -> установке ожиданий -> упражнению -> проверке. В то время как предварительно написанный заглушка будет следовать initialize -> exercise -> verify.

Сходство между Mocks и Stubs

Цель обоих - исключить тестирование всех зависимостей класса или функции, чтобы ваши тесты были более сфокусированными и простыми в том, что они пытаются доказать.

690
ответ дан 22 November 2019 в 21:06
поделиться

Заглушка - это пустая функция, которая используется во избежание необработанных исключений во время тестов:

function foo(){}

Макет - это искусственная функция, которая используется для исключения зависимостей ОС, среды или оборудования во время тестов:

function foo(bar){ window = this; return window.toString(bar); }

С точки зрения утверждений и состояния:

  • Мокки применяются до изменения события или состояния
  • Заглушки не утверждаются, они обеспечивают состояние перед событием для избегать выполнения кода из несвязанных модулей
  • Шпионы настраиваются как заглушки, а затем утверждаются после изменения события или состояния
  • Подделки не утверждаются, они запускаются после события с жестко закодированными зависимостями, чтобы избежать состояния

Список литературы

2
ответ дан Paul Sweatte 24 March 2016 в 17:25
поделиться

Заглушка - это объект, который реализует интерфейс компонента, но вместо того, чтобы возвращать то, что компонент будет возвращать при вызове, заглушка может быть сконфигурирована для возврата значения, подходящего для теста. Используя заглушки, модульный тест может проверить, может ли модуль обрабатывать различные возвращаемые значения от своего соавтора. Использование заглушки вместо реального сотрудника в модульном тесте можно выразить так:

модульный тест -> заглушка

модульный тест -> модуль -> заглушка

модульный тест подтверждает результаты и состояние модуля

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

Mock похож на заглушку, только у него есть методы, позволяющие определить, какие методы были вызваны для Mock . Используя макет, таким образом, можно проверить, может ли устройство правильно обрабатывать различные возвращаемые значения, а также правильно ли оно использует коллаборатора. Например, по значению, возвращенному из объекта dao, вы не можете увидеть, были ли данные прочитаны из базы данных с помощью Statement или PreparedStatement. Также вы не можете увидеть, был ли вызван метод connection.close () перед возвратом значения. Это возможно с насмешками. Другими словами, имитация позволяет проверить целостность взаимодействия юнитов с коллаборатором. Не только методы коллаборатора, которые возвращают значения, используемые модулем. Использование макета в модульном тесте можно выразить так:

модульный тест -> макет

модульный тест -> единица -> макет

утверждает, что модульный тест на результат и состояние модуля

модульный тест утверждает методы, вызываемые на mock

Подробнее >> Здесь

1
ответ дан M_ Fa 24 March 2016 в 17:25
поделиться

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

0
ответ дан Elisabeth 24 March 2016 в 17:25
поделиться

Испытуемый выполняет действия в ответ на определенные подсказки (вызовы функций) или другие стимулы. Вот конкретные примеры тестовых ситуаций.

Сценарий - студенческий экзамен EMT

Студент учился на специалиста по неотложной медицинской помощи. Посмотрите на Яна Галлахера в Бесстыдном Сезон 6, Эпизод 10, если вы не знакомы с этой тестовой ситуацией.

Слишком дорого находить пациентов с различными заболеваниями для целей тестирования. Вместо этого мы используем актеров. Мы спрашиваем испытуемого (Иана): «Вы прибыли на место, а пациент обездвижен и потерял сознание, что вы делаете в первую очередь?» Ян отвечает: «Я проверяю, безопасна ли сцена». И инструктор по тестированию говорит, что «сцена безопасна».

Инструктор (и актер) могут вводить произвольные ответы на запросы испытуемого.

Здесь, инструктор (и актер) являются насмешкой. Медицинская подготовка использует эту терминологию (например, симуляцию имитационного кода) так же, как компьютерные ученые.

Сценарий - зарегистрируйтесь на сайте

Вы тестируете Yahoo, новую почтовую службу, о которой вы слышали. Чтобы зарегистрироваться, вы должны указать свой день рождения и ответы на другие навязчивые вопросы.

Веб-сайт требует, чтобы вы были 21 года или старше. Таким образом, вы вводите значение 1 января 1970 года. Оно соответствует требованиям и избавляет вас от трудоемкого процесса внедрения процесса «запомни мой день рождения и набери его».

Эта дата незавершена. Это слово используется для компьютерных наук.

0
ответ дан William Entriken 24 March 2016 в 17:25
поделиться

Я наткнулся на эту интересную статью UncleBob The Little Mocker . Это объясняет всю терминологию в очень простой для понимания форме, поэтому она полезна для начинающих. Статья Мартина Фаулерса очень трудна для чтения, особенно для таких начинающих, как я.

4
ответ дан A.I 24 March 2016 в 17:25
поделиться

См. Ниже пример mocks против заглушек с использованием C # и Moq framework. В Moq нет специального ключевого слова для Stub, но вы можете использовать объект Mock для создания заглушек.

namespace UnitTestProject2
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Moq;
    [TestClass]
    public class UnitTest1
    {
        /// <summary>
        /// Test using Mock to Verify that GetNameWithPrefix method calls Repository GetName method "once" when Id is greater than Zero
        /// </summary>
        [TestMethod]
        public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
        {
            // Arrange 
            var mockEntityRepository = new Mock<IEntityRepository>();
            mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));

            var entity = new EntityClass(mockEntityRepository.Object);
            // Act 
            var name = entity.GetNameWithPrefix(12);
            // Assert
            mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Once);
        }
        /// <summary>
        /// Test using Mock to Verify that GetNameWithPrefix method doesn't call Repository GetName method when Id is Zero
        /// </summary>
        [TestMethod]
        public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
        {
            // Arrange 
            var mockEntityRepository = new Mock<IEntityRepository>();
            mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
            var entity = new EntityClass(mockEntityRepository.Object);
            // Act 
            var name = entity.GetNameWithPrefix(0);
            // Assert
            mockEntityRepository.Verify(m => m.GetName(It.IsAny<int>()), Times.Never);
        }
        /// <summary>
        /// Test using Stub to Verify that GetNameWithPrefix method returns Name with a Prefix
        /// </summary>
        [TestMethod]
        public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
        {
            // Arrange 
            var stubEntityRepository = new Mock<IEntityRepository>();
            stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
                .Returns("Stub");
            const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
            var entity = new EntityClass(stubEntityRepository.Object);
            // Act 
            var name = entity.GetNameWithPrefix(12);
            // Assert
            Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
        }
    }
    public class EntityClass
    {
        private IEntityRepository _entityRepository;
        public EntityClass(IEntityRepository entityRepository)
        {
            this._entityRepository = entityRepository;
        }
        public string Name { get; set; }
        public string GetNameWithPrefix(int id)
        {
            string name = string.Empty;
            if (id > 0)
            {
                name = this._entityRepository.GetName(id);
            }
            return "Mr. " + name;
        }
    }
    public interface IEntityRepository
    {
        string GetName(int id);
    }
    public class EntityRepository:IEntityRepository
    {
        public string GetName(int id)
        {
            // Code to connect to DB and get name based on Id
            return "NameFromDb";
        }
    }
}
4
ответ дан Adarsh Shah 24 March 2016 в 17:25
поделиться

Вот описание каждого из них, за которым следует пример из реального мира.

  • Пустышка - просто фиктивные значения для удовлетворения API.

    Пример : Если вы тестируете метод класса, который требует много обязательных параметров в конструкторе, который не оказывает влияния на ваш тест, то Вы можете создавать фиктивные объекты с целью создания новых экземпляров класса.

  • Fake - создать тестовую реализацию класса, которая может зависеть от некоторой внешней инфраструктуры. (Хорошей практикой является то, что ваш юнит-тест НЕ фактически взаимодействует с внешней инфраструктурой.)

    Пример : Создать фальшивую реализацию для доступа к базе данных, заменить ее с коллекцией in-memory.

  • Заглушка - переопределять методы для возврата жестко закодированных значений, также называемых state-based.

    Пример : Ваш тестовый класс зависит от метода Calculate(), который занимает 5 минут. Вместо того, чтобы ждать 5 минут, вы можете заменить его реальную реализацию заглушкой, которая возвращает жестко закодированные значения; занимая лишь небольшую долю времени.

  • Mock - очень похоже на Stub, но interaction-based, а не на основе состояния. Это означает, что вы не ожидаете от Mock возврата какого-либо значения, но предполагаете, что выполняется определенный порядок вызовов методов.

    Пример: вы тестируете класс регистрации пользователя. После вызова Save он должен позвонить SendConfirmationEmail.

Stubs и Mocks на самом деле являются подтипами Mock, оба меняют реальную реализацию на тестовую реализацию, но по разным, специфическим причинам.

215
ответ дан Rafael Espinoza 24 March 2016 в 17:25
поделиться

Заглушка является простым поддельным объектом. Это просто гарантирует, что тест проходит гладко.
Насмешка - умная заглушка. Вы проверяете, что ваш тест проходит через него.

295
ответ дан Daniel Holmes 24 March 2016 в 17:25
поделиться

Чтобы быть очень ясным и практичным:

Заглушка: класс или объект, который реализует методы класса / объекта, которые нужно подделать, и всегда возвращает то, что вы хотите.

Пример в JavaScript:

var Stub = {
   method_a: function(param_a, param_b){
      return 'This is an static result';
   }
}

Макет: то же самое с заглушкой, но он добавляет некоторую логику, которая «проверяет», когда вызывается метод, так что вы можете быть уверены, что какая-то реализация вызывает этот метод.

Как говорит @mLevan, представьте в качестве примера, что вы тестируете класс регистрации пользователей. После вызова Save, он должен вызвать SendConfirmationEmail.

Очень глупый код. Пример:

var Mock = {
   calls: {
      method_a: 0
   }

   method_a: function(param_a, param_b){
     this.method_a++; 
     console.log('Mock.method_a its been called!');
   }
}
16
ответ дан R01010010 24 March 2016 в 17:25
поделиться

Этот слайд очень хорошо объясняет основные различия.

enter image description here

* Из CSE 403 Лекция 16, Университет Вашингтона (слайд, созданный «Марти Степпом»)

14
ответ дан Aviram Fireberger 24 March 2016 в 17:25
поделиться

Я думаю, что самое важное различие между ними заключается в их намерениях.

Позвольте мне попытаться объяснить это в заглушка WHY против ПОЧЕМУ mock

Предположим, я пишу тестовый код для общедоступного контроллера временной шкалы моего mac-клиента

Вот пример тестового кода

twitter_api.stub(:public_timeline).and_return(public_timeline_array)
client_ui.should_receive(:insert_timeline_above).with(public_timeline_array)
controller.refresh_public_timeline
  • STUB: Сетевое подключение к Twitter API очень медленное, что делает мой тест медленным. Я знаю, что он вернет временные шкалы, поэтому я сделал заглушку, имитирующую HTTP Twitter API, чтобы мой тест выполнялся очень быстро, и я могу запустить тест даже в автономном режиме.
  • MOCK: я еще не написал ни один из своих методов пользовательского интерфейса, и я не уверен, какие методы мне нужно написать для моего объекта пользовательского интерфейса. Я надеюсь узнать, как мой контроллер будет взаимодействовать с моим объектом пользовательского интерфейса, написав тестовый код.

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

Предлагаю прочитать эту статью, если вы хотите узнать больше о макетах: http://jmock.org/oopsla2004.pdf

18
ответ дан Adam Parkin 24 March 2016 в 17:25
поделиться

Я читал Искусство Поблочного тестирования и наткнулся на следующее определение:

А фальшивка является общим термином, который может быть использован для описания или тупика или фиктивного объекта (рукописный или иначе), потому что они оба похожи на реальный объект. Незавершена ли фальшивка, или насмешка зависит от того, как она используется в текущем тесте. если это используется для проверки взаимодействия (утверждаемый против), это фиктивный объект . Иначе это тупик .

2
ответ дан 22 November 2019 в 21:06
поделиться

насколько я понимаю ...

  • если вы создаете тестовые объекты локально и снабжаете ими свою локальную службу, вы используете фиктивный объект. это даст возможность проверить метод, который вы реализовали в своей локальной службе. он используется для проверки поведения

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

0
ответ дан 22 November 2019 в 21:06
поделиться

A Mock это просто проверка поведения, чтобы убедиться, что вызываются определенные методы. Заглушка - это тестируемая версия (сама по себе) определенного объекта.

Что значит «стиль Apple»?

22
ответ дан 22 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: