Установка тестирования с подделками или издевателями? [закрыто] -- unit-testing поле с участием tdd пол Связанный проблема

Unit Testing with fakes or mocks? [closed]


8
vote

проблема

русский
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»>
<Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 5.6A6.31 6.31 0 002.39 5.75C.49.39.76.93.76 1.5V.24C0 1.07.89 1.9 1.92 1.92.75C1.04 0 1.92-.83 1.92-1.9v-. 2C0-.6.26-1.15.7-1.6.26-1.15.7-1.48A6.32 6.32 0 0015 6.37ZM4.03 5.85A4.49 4.49 0 018 2.02A4.48 4,48 0 015 4.36 4.3 4,3 0 01-1.72 3.44C-01-1.74-1.5 1.9- 1.5 3.08V.1H7.2V-.14C0-1.23-.6-2.34-1.3-1.32.32-1.53-3.07A4.32.32.32 0 01-1.64-3.94ZM10 18A1 1 0 000-2х7А1 1 0 100 2H3Z ">
Трудно сказать, что здесь спрашивает. Этот вопрос неоднозначный, расплывчатый, неполный, чрезмерно широкий или риторический, и не может быть разумно отвечать в его текущей форме. Для уточнения этого вопроса, чтобы его можно было возобновить, Посетите справочный центр .
Закрыто 8 лет назад .

Я пытаюсь следовать передовым практикам при написании моих испытаний. На полпути я понял, что я проводит много времени (большинство) моего времени на поддельных объектах ... Большинство моих тестов делают что-то вроде этого

 <код> public interface ITemplateRepository {   string get GetGenericTemplate {get;} }   


 <код> public FakeTemplateRepository : ITemplateRepository {    public string GetGenericTemplate ()    {      return "<xml>Complex</xml>";    } }   


 <код> [Test] public void CanGetGenericTemplate() {   ITemplateRepository rep = new FakeTemplateRepository();   Assert.IsNotNull(rep.GetGenericTemplate()); }      


 <код> [Test] public void GetGenericTemplateContains() {   ITemplateRepository rep = new FakeTemplateRepository(); Assert.IsTrue(rep.GetGenericTemplate().StartsWith("<xml>")); }   

Я на самом деле обнаружил, что проводил много времени на FaketemplatePositor, убедившись, что он вернул фактическое содержание, которое я ожидал. Это плохая вещь?

Это все еще действующий тест подразделения? Устройство тестирования должно быть быстрым и простым, нет? Но, честно говоря, я не совсем уверен, одна вещь наверняка заключается в том, что она получила мое мышление о форме и содержании моих данных. Содержание в Fakerepositor будет более или менее отражать моего производственного контента, хотя и чтение из файловой системы, а не в памяти.

Если на самом деле я делаю тесты, - это интеграционные тесты, то как я должен использовать издевательства для моих модульных тестов?

Это не имеет смысла для меня (если использовать издевательства), которые я устанавливаю ожидание, чтобы он вызывал метод и возвращает строку? Я что-то упускаю, но я не вижу там много ценности? Код не будет даже компилировать, если я устанавливаю неверное имя метода!

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

Может ли кто-нибудь продемонстрировать с супер простой пример того, как подделки и издеватели вписываются в люкс? E.g Что должен быть тестом на единицу, что должно быть тестом интеграции?

Спасибо

Английский оригинал

I'm trying to follow good practices when writing my testing suites. Halfway through i realised that iam spending alot (Most) of my time on the Fake Objects...Most of my tests does something like this

public interface ITemplateRepository {   string get GetGenericTemplate {get;} } 


public FakeTemplateRepository : ITemplateRepository {    public string GetGenericTemplate ()    {      return "<xml>Complex</xml>";    } } 


[Test] public void CanGetGenericTemplate() {   ITemplateRepository rep = new FakeTemplateRepository();   Assert.IsNotNull(rep.GetGenericTemplate()); }    


[Test] public void GetGenericTemplateContains() {   ITemplateRepository rep = new FakeTemplateRepository(); Assert.IsTrue(rep.GetGenericTemplate().StartsWith("<xml>")); } 

I actually found myself spending alot of time on the FakeTemplateRepository, making sure it returned the actual content i was expecting. Is this a bad thing?

Is this still a valid Unit Test? Unit testing should be fast and simple, no? But honestly i'm not really sure, one thing for sure is that it got my thinking about the shape and content of my data. The content in the FakeRepository will more or less reflect my production content, albeit reading from the file system, instead of in-memory.

If in fact what i'm doing are Integration Tests, then how should i use mocks for my unit tests?

It doesnt make sense to me (if using Mocks) that i set the expectation up so that it calls the method and returns a string? Am i missing something but i don't see much value there? The code wont even compile if i set an invalid method name!

I am really really confused about the whole thing and my perception of unit testing is totally blurred now with all these concepts.

Can anyone demonstrate with a super super simple example of how fakes and mocks fit into a suite? e.g What should be a unit test, What should be an integration test?

Thanks

</div
     
 
 

Список ответов

10
 
vote

Еще раз ... Другое лицо влюбляется в макет анти-образцы. Вы «тестируете макет» или поддельный объект - который вообще не используется. Макеты должны быть использованы для абстрагирования зависимостей или сотрудников вашего теста. Не сам тестовый предмет.

Сначала я бы сказал, прочитал бумагу Мартина Фаулера " Макеты не заглушки " Отказ Если вы хотите вернуть значения или настроить ожидания для конкретных аргументов, перейдите на насмешливую структуру над Roll-Your-Source Fakes. Подделки, как правило, используются для заглушки сотрудников ... где вам все равно, чтобы сотрудничать. E.G. Вырубить сеть или файл IO.
Затем прочитайте Это похоже на этот вопрос и ответы на него ..

 

Once again... another person falls into a Mock Anti-pattern. You're "testing a Mock" or Fake object - which isn't of any use at all. Mocks need to be use to abstract away the dependencies or collaborators of your test subject.. not the test subject itself.

First, I'd say read Martin Fowler's paper "Mocks Aren't Stubs". If you'd like to return values or setup expectations for specific arguments, go for a mocking framework over Roll-your-own fakes. Fakes are generally used to stub out collaborators... where you don't care for the collaborator.. e.g. stub out network or file IO.
Next read this similar SO question and the answers to it..

</div
 
 
5
 
vote

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

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

Вот что выглядит код.

 <код> public class DocumentGenerator {   ITemplateRepository _repo;    DocumentGenerator( ITemplateRepository repo )   {     _repo = repo;   }    Doc GenerateDoc()   {    ....    _repo.GetGenericTemplate();     ....   } }   [Test] public void GenerateDocTest() {   ITemplateRepository rep = new FakeTemplateRepository();   DocumentGenerator docGenerator = new DocumentGenerator( rep );   Assert.IsNotNull(docGenerator.GenerateDoc()); }   

Гист примера заключается в том, что вы тестируете что-то, что использует подделка. Вы не проверяете фальшивую саму. Подделка существует так, что то, что вы тестируете, не зависит от чего-то внешнего.

 

In your example, you are testing your fake. You can't make sense out of this, because it doesn't make sense.

Here's an example of how you should use a fake. You want to unit test the DocumentGenerator class. This class happens to use the services of a ITemplateRepository. However, to properly unit test DocumentGenerator you want to make sure it doesn't depend on any external services. So you provide DocumentGenerator with a fake ITemplateRepository that will return canned results.

Here is what the code looks like.

public class DocumentGenerator {   ITemplateRepository _repo;    DocumentGenerator( ITemplateRepository repo )   {     _repo = repo;   }    Doc GenerateDoc()   {    ....    _repo.GetGenericTemplate();     ....   } }   [Test] public void GenerateDocTest() {   ITemplateRepository rep = new FakeTemplateRepository();   DocumentGenerator docGenerator = new DocumentGenerator( rep );   Assert.IsNotNull(docGenerator.GenerateDoc()); } 

The gist of the example is that you testing something that uses a fake. You are not testing the fake itself. The fake exists so that the thing you are testing is not dependent on something external.

</div
 
 
   
   
2
 
vote

Прежде всего, выучить структуру изоляции (издевательства), например moq или < href = "http://ayende.com/projects/rhino-mocks.aspx" Rel = "nofollow noreferrer"> носорог Mocks . Это сэкономит вам много времени.

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

Это сложный предмет, и вам нужно будет сделать некоторое чтение. Asherove's Искусство тестирования подразделения дешево в своей электронной книге и делает довольно хорошую работу по объяснению это. Вы также захотите прочитать на Инъекция зависимостей .

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

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

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

редактировать : теперь я читаю растущий объект- Ориентированное программное обеспечение, руководствуясь тестами и ставить под сомнение мою «избегать макинов». Если у вас есть объекты, которые следуют Скажите, не спрашивайте Тогда государственное тестирование может быть сложно ,

 

First of all, learn an isolation (mocking) framework, like Moq or Rhino Mocks. This will save you a lot of time.

Second, avoid creating mocks whenever possible and stick to stubs. Stubs just return values; you don't assert against them. Instead you assert that the state of the class under test is what you expected it to be. Use stubs to stub out injected dependencies.

This is a complex subject, and you'll need to do some reading. Osherove's Art of Unit Testing is cheap in its e-book form, and does a pretty good job of explaining this. You'll also want to read up on Dependency Injection.

Remember that you don't need fakes, mocks, or stubs to test many classes. The point is to test the public behavior of the actual class in isolation. Fakes are simply one tool to help you isolate the class from any dependencies.

Your examples concentrate on fakes, interfaces, and tests. Concentrate on the class under test and its desired behavior.

Integration tests have value too; you can wire everything up to a test database and make sure that it all works. They tend to be slow, as opposed to unit tests.

EDIT: Now I'm reading Growing Object-Oriented Software, Guided by Tests and questioning my "avoid mocks" standpoint. If you have objects that follow Tell, Don't Ask then state testing can be difficult.

</div
 
 

Связанный проблема

7  Ошибка тестирования блока - адаптер теста устройства не удалось подключиться к источнику данных или для чтения данных  ( Unit testing error the unit test adapter failed to connect to the data source ) 
Я использую VSTS 2K8, и я настроил модульный тестовый проект. В нем у меня есть тестовый класс с методом, который делает простое утверждение. Я использую элек...

8  Python Unittest, сделай что-то только в случае неудачно  ( Python unittest do something only if test fails ) 
При использовании unittest Библиотека из Python 3 Я хотел бы выполнить некоторые действия, только если тест не удается (но это должно быть на уровне класса,...

1  Затмение - не в состоянии запустить тесты Testng  ( Eclipse not able to run testng tests ) 
Я использую Eclipse kepler 4.3.2 и установил Testng Plug-in для него, но не могу запускать программу Testng, поскольку консоль Testng отображается ниже ошибки...

0  Проверьте плоский файл содержимого и формат в Java  ( Test flat file content and format in java ) 
Я должен отправить плоский файл во внешнюю систему. Содержание файла пример приведено ниже: <код> START 20150602 HEADER 100.00USD PRODUCT TEST1 ...

0  CXXTESTESTGEN.PY бросить синтаксисную ошибку  ( Cxxtestgen py throw a syntax error ) 
Я следую по учебнику на Интеграция CXXTEST Visual Studio и я посмотрел на Google, но ничего не нашел. Когда я пытаюсь обедать базовый тест с CXXTEST и Vis...

1  Как использовать дженерики, содержащие частные типы с тестами визуальных студийных единиц  ( How to use generics containing private types with visual studio unit tests ) 
У меня есть проблема с классом, который я пытаюсь проверить. Я объявил частный Enum, и я использую это в общем словаре в коде. Этот Enum не имеет значения за ...

46  Охват кода тестирования подразделения - У вас есть 100% покрытие?  ( Unit testing code coverage do you have 100 coverage ) 
Произобрали ли тесты устройства 100% Code Coverage? Да или нет, а почему или почему нет. ...

1  Проблемы PHPUNIT Setup и PHP  ( Phpunit setup and php directory issues ) 
Я знаю, что это, вероятно, больше спрашивает, но я не использовал PHP в действительно долгое время, и я вновь борюсь со своим поведением пути и включает в себ...

3  ClassnotfoundException с Junit при использовании класса. Формушка (..). GetInstance в то время как новые () работает нормально  ( Classnotfoundexception with junit when using class forname getinstance while ) 
Я получаю <код> ClassNotFoundException при запуске тестов с JUNIT: У меня есть куча тестов, которые тестируют класс основной. Основным классом имеет метод,...

0  Агрегатное тестовое утверждение от конечного результата или проверки того, были ли параметры называются с помощью MOQ  ( Unit test assert against end result or verifying whether the parameters were cal ) 
Ниже приведен класс (Class1), который я хочу проверить, но я не полностью удовлетворен своим тестом монтажа. Пожалуйста, смотрите ниже образцы кода. Система...

1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса?  ( Stop msvc debug errors from blocking the current process ) 
Любые неудачные утверждения Assert в Windows приводят к появлению подразделения ниже и замораживают выполнение приложений. Я понимаю, что это ожидаемое поведе...

4  Тест на единицу с файлами Система зависимости - скрытые файлы  ( Unit test with files system dependency hidden files ) 
Я пишу «Total Commander», как приложение в Java. Здесь вполне очевидная зависимость файловой системы здесь. Я хочу установить тестирование его. Я создал стр...

1  N Установление алфавитного заказа  ( N unit alphabetical order assertion ) 
У меня есть поле поиска на веб-сайте, который возвращает результаты поиска, на основе ключевого слова (хранение их в виде списка в C #) Есть параметры фильт...

2  Неспособность создавать «монгомаксиновую боб», когда тестирование единицы с FOGO  ( Failing to create mongomappingcontext bean when unit testing with fongo ) 
Я в настоящее время устанавливаю тест подразделения для проекта, на котором я работаю, и я бегаю в немного стены. Проект, на котором я работаю, использует Mon...

4  Использование делегатов вместо интерфейсов для развязки. Хорошая идея?  ( Using delegates instead of interfaces for decoupling good idea ) 
При написании приложений GUI я использую класс верхнего уровня, который «Controls» или «координирует» приложение. Класс верхнего уровня будет нести ответствен...

Связанный проблема

7  Ошибка тестирования блока - адаптер теста устройства не удалось подключиться к источнику данных или для чтения данных 
8  Python Unittest, сделай что-то только в случае неудачно 
1  Затмение - не в состоянии запустить тесты Testng 
0  Проверьте плоский файл содержимого и формат в Java 
0  CXXTESTESTGEN.PY бросить синтаксисную ошибку 
1  Как использовать дженерики, содержащие частные типы с тестами визуальных студийных единиц 
46  Охват кода тестирования подразделения - У вас есть 100% покрытие? 
1  Проблемы PHPUNIT Setup и PHP 
3  ClassnotfoundException с Junit при использовании класса. Формушка (..). GetInstance в то время как новые () работает нормально 
0  Агрегатное тестовое утверждение от конечного результата или проверки того, были ли параметры называются с помощью MOQ 
1  Остановите ошибки Debug MSVC ++ от блокировки текущего процесса? 
4  Тест на единицу с файлами Система зависимости - скрытые файлы 
1  N Установление алфавитного заказа 
2  Неспособность создавать «монгомаксиновую боб», когда тестирование единицы с FOGO 
4  Использование делегатов вместо интерфейсов для развязки. Хорошая идея? 



© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.