Unit-test, просветите?
От: Аноним  
Дата: 17.01.14 00:55
Оценка:
Пишу на MS VS 2010, решил добавить тесты, добавил тестовый проект, добавил тест, смотрю — там .net, а как сделать чистый с++ тест?
Re: Unit-test, просветите?
От: landerhigh Пират  
Дата: 17.01.14 01:00
Оценка: 5 (3) -1
Здравствуйте, Аноним, Вы писали:

А>Пишу на MS VS 2010, решил добавить тесты, добавил тестовый проект, добавил тест, смотрю — там .net, а как сделать чистый с++ тест?


В 2012 студии добавили нативный тест фреймворк. А пока самым лучшим вариантом будет скачать google test/boost test/cppunit.

Использовать managed test framework для тестирования нативного кода — очень, очень плохая идея.
www.blinnov.com
Re[2]: Unit-test, просветите?
От: CEMb  
Дата: 17.01.14 02:09
Оценка:
Здравствуйте, landerhigh, Вы писали:

А>>Пишу на MS VS 2010, решил добавить тесты, добавил тестовый проект, добавил тест, смотрю — там .net, а как сделать чистый с++ тест?


L>В 2012 студии добавили нативный тест фреймворк. А пока самым лучшим вариантом будет скачать google test/boost test/cppunit.


Ну у меня пока только 2010
А интегрировать кого-то или всех из google test/boost test/cppunit в VS2010 можно как-то? Или просто добавить проект в проект и связать.

L>Использовать managed test framework для тестирования нативного кода — очень, очень плохая идея.


Это да
Re[3]: Unit-test, просветите?
От: landerhigh Пират  
Дата: 17.01.14 02:19
Оценка:
Здравствуйте, CEMb, Вы писали:

L>>В 2012 студии добавили нативный тест фреймворк. А пока самым лучшим вариантом будет скачать google test/boost test/cppunit.


CEM>Ну у меня пока только 2010


Кучеряво живете! Некоторые, вон, еще на 2005 пишут

CEM>А интегрировать кого-то или всех из google test/boost test/cppunit в VS2010 можно как-то?


Периодически появляются плагины то для одного, то для другого. Я их ставил, пробовал и сносил нафиг, потому что (см. ниже)

CEM>Или просто добавить проект в проект и связать.


Единственная интеграция, которая мне лично нужна, состоит в добавлении автозапуска тестового экзешника в Post-build step.
Да, нет легкой возможности выборочного запуска тест кейсов, но это не более чем небольшое неудобство.

L>>Использовать managed test framework для тестирования нативного кода — очень, очень плохая идея.


CEM>Это да


Даже хуже!
www.blinnov.com
Re[2]: Unit-test, просветите?
От: Abyx Россия  
Дата: 17.01.14 09:20
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>Использовать managed test framework для тестирования нативного кода — очень, очень плохая идея.

чем плохая?
тем что тебе .NET не нравится чтоли?

я долго использовал MS Test для нативного С++ и никаких проблем не заметил.
In Zen We Trust
Re[3]: Unit-test, просветите?
От: landerhigh Пират  
Дата: 17.01.14 10:39
Оценка: 20 (2) +1
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, landerhigh, Вы писали:


L>>Использовать managed test framework для тестирования нативного кода — очень, очень плохая идея.

A>чем плохая?

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

A>тем что тебе .NET не нравится чтоли?


Причем тут нравится/не нравится? Бывают инструменты, пригодные для работы и не пригодные.

A>я долго использовал MS Test для нативного С++ и никаких проблем не заметил.


Повезло.

1. До версии 2010 MSTest при использовании его для тестирования нативного кода начинал вставать в интересную позицию по превышении некоторого (небольшого) числа тестов в солюшене. Корреляции не заметили, зависимость была и о числа тест кейсов и от сложности тестируемого и включаемого в тест кода. Студия просто становилась абсолютно неюзабельной от 15 минут до бесконечности. M$ проблему подтвердили, в качестве "решения" предложили отключить IntelliSense. С отключением коего пропадал и (сюрприз!) MsTest. Затем их ответ был, то MsTest не предназначен для тестирования нативного кода и мы типа ССЗБ.

2. Простейший ассерт по двум строкам превращается в кошмар вида

Assert::AreEqual(gcnew System::String(string1.c_str()), gcnew System::String(string2.c_str()));


3. Заумные ассерты, которые зачем-то сравнивают типы в рантайме
То есть вот это

Assert::AreEqual(12, number2);


проваливало тест кейс, даже если number2 содержал число 12 только потому, что "умный" MsTest думал, что 12 — это знаковый тип, а number2 был беззнаковым.


4. Оно медленное! Настолько медленное, что сравнивать скорость выполнения теста с тем же google test ну никак нельзя.
5. Не забываем, что тесты компилирются другим компайлером и линкуются другим линкером. В связи с этим возникали приколы, когда тестируемый код содержал объект некоего сложного типа в качестве статического мембера, а компайлер нам молвил английским голосом, что он такого не умеет
6. Тест класс — управляемый. Значит, его членами не могут быть нативные классы. Только по указателю Привет, куча врапперов на ровном месте
7. Только в 2010 студии появилась наконец возможность сразу прыгнуть на место ассерта. До этого все, что тебе давали — очень информативный "атчод" и указание на место ошибки текстом. Навигируй, типа, сам.
8. До 2010 студии MSTest пытался умничать, запуская несколько тестов на выполнение в параллель. Не отключалось никак. Какие это проблемы вызывало при тестировании кода, для которого требовались заведомо неконкурентная среда, даже описывать не буду.
9. Периодические совершенно невразумительные падения в MSTest уже после завершения тестов, не поддающиеся отладке.
10. Хоть и очень редко, но иногда возникала необходимость отладки. Mixed отладчик — та еще кака.
11. Попробуй хотя бы сделать так, чтобы тесты запускались автоматически при каждом билде, без применения паттерна "стоя и в гамаке"

Любого из этих пунктов, на самом деле, достаточно, чтобы даже не начинать рассматривать это поделие для тестирования нативного C++ кода, особенно когда есть правильные решения. Единственный плюс — интеграция со студией, но толку от нее, если честно, чуть более, чем никакого.
www.blinnov.com
Re[4]: Unit-test, просветите?
От: Abyx Россия  
Дата: 17.01.14 11:31
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>2. Простейший ассерт по двум строкам превращается в кошмар вида


L>
L>Assert::AreEqual(gcnew System::String(string1.c_str()), gcnew System::String(string2.c_str()));
L>


я использовал функции типа String^ Str(const std::string&);

L>3. Заумные ассерты, которые зачем-то сравнивают типы в рантайме

L>То есть вот это

L>
L>Assert::AreEqual(12, number2);
L>


L>проваливало тест кейс, даже если number2 содержал число 12 только потому, что "умный" MsTest думал, что 12 — это знаковый тип, а number2 был беззнаковым.

L>

и это правильно, ибо в С++ знаковые типы нельзя сравнивать с беззнаковыми, т.к. можно нарваться на неявный каст.

L>4. Оно медленное! Настолько медленное, что сравнивать скорость выполнения теста с тем же google test ну никак нельзя.

это да. зато UI красивый, code coverage и т.п.

L>8. До 2010 студии MSTest пытался умничать, запуская несколько тестов на выполнение в параллель. Не отключалось никак. Какие это проблемы вызывало при тестировании кода, для которого требовались заведомо неконкурентная среда, даже описывать не буду.

хз, у меня такого в 2005й не было, я нормально тестировал код с синглтонами/моностейтами

L>10. Хоть и очень редко, но иногда возникала необходимость отладки. Mixed отладчик — та еще кака.

и что с ним не так? точно такой же нормальный отладчик

L>11. Попробуй хотя бы сделать так, чтобы тесты запускались автоматически при каждом билде, без применения паттерна "стоя и в гамаке"

зачем, они же медленные
In Zen We Trust
Re[5]: Unit-test, просветите?
От: landerhigh Пират  
Дата: 17.01.14 13:02
Оценка:
Здравствуйте, Abyx, Вы писали:

A>я использовал функции типа String^ Str(const std::string&);


Все равно ахтунг.

L>>3. Заумные ассерты, которые зачем-то сравнивают типы в рантайме

L>>То есть вот это

L>>
L>>Assert::AreEqual(12, number2);
L>>


L>>проваливало тест кейс, даже если number2 содержал число 12 только потому, что "умный" MsTest думал, что 12 — это знаковый тип, а number2 был беззнаковым.

L>>

A>и это правильно, ибо в С++ знаковые типы нельзя сравнивать с беззнаковыми, т.к. можно нарваться на неявный каст.


На минутотчку, в С++ такую проверку нужно проводить во время компиляции. А не в рантайме.

L>>4. Оно медленное! Настолько медленное, что сравнивать скорость выполнения теста с тем же google test ну никак нельзя.

A>это да. зато UI красивый, code coverage и т.п.

Code coverage — спасибо, поржал. Он, к тому же, еще и не работает для С++ на сколько-нибудь сложном коде. А красивый ЮИ некоторых волнует примерно в отрицательную очередь.

L>>8. До 2010 студии MSTest пытался умничать, запуская несколько тестов на выполнение в параллель. Не отключалось никак. Какие это проблемы вызывало при тестировании кода, для которого требовались заведомо неконкурентная среда, даже описывать не буду.

A>хз, у меня такого в 2005й не было, я нормально тестировал код с синглтонами/моностейтами

Повезло.

L>>10. Хоть и очень редко, но иногда возникала необходимость отладки. Mixed отладчик — та еще кака.

A>и что с ним не так? точно такой же нормальный отладчик

Let's agree to disagree. Похоже, что я все же ходил по этим граблям в 100500 раз дольше.

L>>11. Попробуй хотя бы сделать так, чтобы тесты запускались автоматически при каждом билде, без применения паттерна "стоя и в гамаке"

A>зачем, они же медленные

Вот именно.
www.blinnov.com
Re: Unit-test, просветите?
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 17.01.14 13:12
Оценка: 26 (2)
Здравствуйте, Аноним, Вы писали:

А>Пишу на MS VS 2010, решил добавить тесты, добавил тестовый проект, добавил тест, смотрю — там .net, а как сделать чистый с++ тест?

Я как то тоже интересовался тут уже, вот что получилось Исследование фреймворков для Юнит тестирования на C++
Автор: sharcUs
Дата: 13.09.09

Правда давно это было, может сейчас уже совсем все не так.
Re[2]: Unit-test, просветите?
От: Abyx Россия  
Дата: 17.01.14 13:35
Оценка: 20 (3) :)
Здравствуйте, sharcUs, Вы писали:

А>>Пишу на MS VS 2010, решил добавить тесты, добавил тестовый проект, добавил тест, смотрю — там .net, а как сделать чистый с++ тест?

U>Я как то тоже интересовался тут уже, вот что получилось Исследование фреймворков для Юнит тестирования на C++
Автор: sharcUs
Дата: 13.09.09

U>Правда давно это было, может сейчас уже совсем все не так.

сейчас лучший фреймворк — это Catch (https://github.com/philsquared/Catch)
(всё в одном .h файле, удобный синтаксис, быстр, прост в использовании)

последний boost.test тоже неплох.
In Zen We Trust
Re[3]: Unit-test, просветите?
От: uzhas Ниоткуда  
Дата: 17.01.14 19:14
Оценка:
Здравствуйте, Abyx, Вы писали:

A>сейчас лучший фреймворк — это Catch (https://github.com/philsquared/Catch)

A>(всё в одном .h файле, удобный синтаксис, быстр, прост в использовании)

не пользовался, но первое впечатление после прочтения доки и взвешивания исходников
1) все в одном огромном файле (320 Кб папка include весит), ох уж эта мода все в хедеры пихать
2) макросы с простыми именами типа CHECK, REQUIRE, WHEN, GENERATE, FAIL — высока вероятность клешей с другим кодом
3) свои смарт пойнтеры, свой движок xml, свой noncopyable и много еще всяких великов =)
4) не углублялся, почему либа пропагандирует "tearDown — это зло", но под либу придется перестраивать мышление и строить юнит тесты по-другому

в целом, либа выглядит достаточно мощной:
1) куча стратегий, этим напоминает мощный gmock
2) сразу cmdline к тестам появляется
3) есть вменяемая дока

спасибо, надеюсь, однажды пригодится
Re[3]: Unit-test, просветите?
От: nen777w  
Дата: 17.01.14 23:59
Оценка: 3 (1)
Просто добавлю что boost::test не thread safe, но я поборол эту проблему достаточно просто (небольшими правками в либе), тема тут.
Автор: nen777w
Дата: 12.03.13
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.