Юнит тесты в табличном виде
От: A.J. Россия CintaNotes
Дата: 29.09.11 10:33
Оценка:
Приветствую,

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

Так вот, вопрос. Во-первых, есть ли название у такого подхода к юнит-
тестированию. И во-вторых, есть ли библиотеки для C++ которые
поддерживают подобный подход? Спасибо!
Re: Юнит тесты в табличном виде
От: iNibbler Россия  
Дата: 29.09.11 12:31
Оценка:
Здравствуйте, A.J., Вы писали:

AJ>Приветствую,


ATDD, но это скорее не к юнит тестированию, а функциональному/приемочному.

Можно посмотреть в сторону Fit — http://fitnesse.org/FrontPage.FitServers.CppFit.CppTestTools

Использовали инструмент для функциональных тестов, для юнит тестирования, есть подозрение, будет не очень удобным, т.к. существует разделение на код и тесты в табличном представлении.
... << RSDN@Home 1.2.0 alpha 5 rev. 1536>>
Re[2]: Юнит тесты в табличном виде
От: Aikin Беларусь kavaleu.ru
Дата: 30.09.11 06:21
Оценка: 3 (2) +1
Здравствуйте, iNibbler, Вы писали:

N>ATDD, но это скорее не к юнит тестированию, а функциональному/приемочному.

N>Можно посмотреть в сторону Fit — http://fitnesse.org/FrontPage.FitServers.CppFit.CppTestTools

N>Использовали инструмент для функциональных тестов, для юнит тестирования, есть подозрение, будет не очень удобным, т.к. существует разделение на код и тесты в табличном представлении.

FIT, как было сказано, для тестов пользователя (приемочное тестирование).
A.J., походу, имел что-то в таком духе (это NUnit для .net):
[TestCase(12,3,4)]
[TestCase(12,2,6)]
[TestCase(12,4,3)]
public void DivideTest(int n, int d, int q)
{
  Assert.AreEqual( q, n / d );
}

[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
  return( n / d );
}


По поводу наличия таких же плюшек для плюсов я не знаю

СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[3]: Юнит тесты в табличном виде
От: A.J. Россия CintaNotes
Дата: 01.10.11 04:58
Оценка:
Здравствуйте, Aikin, Вы писали:

A>FIT, как было сказано, для тестов пользователя (приемочное тестирование).

A>A.J., походу, имел что-то в таком духе (это NUnit для .net):

Да, именно это имел в виду и поэтому FIT вряд ли подойдет.
Пока что делаю вот так с помощью Boost.Test и Boost.Foreach, в принципе получается достаточно близко к идеалу, хотя конечно хотелось бы
еще больше обобщить:

BOOST_AUTO_TEST_SUITE(TextListManagerTests)

struct Fixture
{
    TestTextEditor editor;
    TextListManager manager;

    Fixture(const wstring& t) : editor(t), manager(&editor) {}
};

BOOST_AUTO_TEST_CASE(SetListStyle)
{
    struct Test { wstring initialText;            ListStyle appliedStyle;   wstring expectedResult; } tests[] = 
    {
        { L"BulletSomeText",                            lsBULLETS,      L"\u2022 BulletSomeText"},
        { L"Bullet\nMultiline\n",                       lsBULLETS,      L"\u2022 Bullet\n\u2022 Multiline\n"},
        { L"\u2022 DontBulletAlreadyBulleted",          lsBULLETS,      L"\u2022 DontBulletAlreadyBulleted" },
        { L"\u2022 MixedStyles\nNotBulleted",           lsBULLETS,      L"\u2022 MixedStyles\n\u2022 NotBulleted" },
        { L"MixedStyles\n\u2022 Bulleted",              lsBULLETS,      L"\u2022 MixedStyles\n\u2022 Bulleted" },

        { L"\u2022 SomeText",                           lsNONE,         L"SomeText" },
        { L" \u2022 SomeText",                          lsNONE,         L"SomeText" },
        { L"\u2022 SomeText\n\t\u2022 Second line",     lsNONE,         L"SomeText\nSecond line" },
        { L"\u2022 MixedStyles\nNotBulleted",           lsNONE,         L"MixedStyles\nNotBulleted" },
        { L"MixedStyles\n\u2022 Bulleted",              lsNONE,         L"MixedStyles\nBulleted" },
        { L"\u20221\n\u20222\n\u20223\n",               lsNONE,         L"1\n2\n3\n" },

        { L"SomeText",                                  lsNUMBERS,      L"1. SomeText" },
    };

    BOOST_FOREACH(Test test, tests)
    {            
        Fixture f(test.initialText);
        f.manager.setListStyle(test.appliedStyle);

        BOOST_CHECK_MESSAGE(f.editor.text == test.expectedResult, 
          format("Expected setListStyle({0}) to turn '{1}' into '{2}', but got '{3}'", 
                to_string(test.appliedStyle), test.initialText, test.expectedResult, f.editor.text));
    }
}

BOOST_AUTO_TEST_SUITE_END()
Re[4]: Юнит тесты в табличном виде
От: -VaS- Россия vaskir.blogspot.com
Дата: 06.10.11 10:06
Оценка:
AJ>Да, именно это имел в виду и поэтому FIT вряд ли подойдет.

Почему же не подойдет? Единственный недостаток — большие затраты на поддержку. Зато наглядность и простота диагностики отличные.
Кстати, в Cucumber тоже есть табличные тесты. Не знаю, есть ли он для плюсов.
Re: Юнит тесты в табличном виде
От: bkat  
Дата: 07.10.11 18:47
Оценка:
Здравствуйте, A.J., Вы писали:

AJ>Приветствую,


AJ>Так вот, вопрос. Во-первых, есть ли название у такого подхода к юнит-

AJ>тестированию. И во-вторых, есть ли библиотеки для C++ которые
AJ>поддерживают подобный подход? Спасибо!

http://en.wikipedia.org/wiki/Data-driven_testing

На C++ мы это делаем с помощью Qt Test, потому как в целом юзаем Qt.
Для .Net это тоже доступно:
http://msdn.microsoft.com/en-us/library/ms182527.aspx
Re: Юнит тесты в табличном виде
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 21.10.11 13:25
Оценка:
Здравствуйте, A.J., Вы писали:

AJ> И во-вторых, есть ли библиотеки для C++ которые поддерживают

AJ> подобный подход? Спасибо!

Насколько я помню, Qt поддерживает. QtTest, или как там его..
Тащить для этого Qt в основной проект не придётся — можно просто тесты или часть тестов на QtTest написать.
С уважением, Artem Korneev.
Re: Юнит тесты в табличном виде
От: . Великобритания  
Дата: 23.10.11 18:26
Оценка:
Здравствуйте, A.J., Вы писали:

AJ> Так вот, вопрос. Во-первых, есть ли название у такого подхода к юнит-

AJ> тестированию. И во-вторых, есть ли библиотеки для C++ которые
AJ> поддерживают подобный подход? Спасибо!
Пишем вспомогательную функцию:
void testMe(ResultType expected, Type1 arg1, Type2 arg2, ..., TypeN argN)
{
  myCode(arg1, ..., argN);
  int i = moreCode(arg1, ...);
  assertEquals(expected, muchMoreCode(i, argN));
}

// а вот и таблица
  testMe(1, 2, "abc");
  testMe(3, 4, "cde");

Что тут ещё надо? Зачем ещё какой-то фреймворк? И так кода минимум.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.