CPPUnit как написать тест?

Хорошо, я в основном хочу сдвинуться с мертвой точки и написать несколько тестов CPPUnit, но я понятия не имею, как это сделать. Здесь у меня есть код, который в основном получает указатель на кнопку меню для связанной группы кнопок и аргументов позиции, как мне создать тест для этого?

CMenuButton* CMenuContainer::GetButton(const enumButtonGroup argGroup, const int32_t argPosition)
{
   CMenuButton* pButton = NULL;
   if (argGroup < MAX_GROUP_BUTTONS)
   {
      pButton = m_ButtonGroupList[argGroup].GetButton(argPosition);
   }
   return pButton;

В ответ на @Fabio Ceconello, можно ли установить некоторые тесты для такого кода?

unsigned long CCRC32::Reflect(unsigned long ulReflect, const char cChar)
{
    unsigned long ulValue = 0;

    // Swap bit 0 for bit 7, bit 1 For bit 6, etc....
    for(int iPos = 1; iPos < (cChar + 1); iPos++)
    {
        if(ulReflect & 1)
        {
            ulValue |= (1 << (cChar - iPos));
        }
        ulReflect >>= 1;
    }

    return ulValue;
}

person bigbaz34    schedule 17.11.2011    source источник


Ответы (1)


CppUnit плохо подходит для создания автоматизированных тестов пользовательского интерфейса. Это больше для единиц обработки. Например, предположим, что вы создали замену для std::vector и хотите убедиться, что она ведет себя как исходная, вы можете написать тесты, которые добавляют элементы как в вашу, так и в стандартную реализацию, а затем выполнить дополнительную обработку (удаление, изменение элементов и т. д.). .) и после каждого шага проверяйте, имеют ли они согласованный результат.

Для пользовательского интерфейса я не знаю хороших бесплатных инструментов с открытым исходным кодом, но есть один хороший коммерческий инструмент TestComplete от Smart Bear и другие.

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

Предполагая первый вариант, вы можете написать тест следующим образом:

class CRC32Test : public CppUnit::TestCase 
{ 
    public: 
        CRC32Test( std::string name ) : CppUnit::TestCase( name ) {}

    void runTest() 
    {
        struct Sample {unsigned long ulReflect; char cChar; unsigned long result};
        static Sample samples[] = 
        {
        // Put here the pre-calculated values 
        };

        int count = sizeof(samples) / sizeof(Sample);
        for (int i = 0; i < count; ++i)
            CPPUNIT_ASSERT(subject.Reflect(samples[i].ulReflect, samples[i].cChar) == samples[i].result);
   }

    private:
        CRC32 subject;
};

int main(void)
{
    CppUnit::TextUi::TestRunner runner;
    runner.addTest(new CppUnit::TestCaller<CRC32Test>("test CRC32", &CRC32::runTest));
    runner.run();
}
person Fabio Ceconello    schedule 17.11.2011
comment
Я ответил вам и добавил код в свой основной вопрос. - person bigbaz34; 17.11.2011
comment
Спасибо за вашу помощь. Я полный новичок в этих тестах cppunit, как мне заставить его работать? включить заявления? #include cppunit.h или что-то в этом роде? - person bigbaz34; 18.11.2011
comment
Да, извините, что не упомянул об этом, я пропустил части подготовки. CPPUnit использует соглашение об одном заголовке на класс, а имя заголовка такое же, как и у соответствующего класса. Итак, в приведенном выше примере вам нужно #include TestCase.h, TestRunner.h и TestCaller.h - person Fabio Ceconello; 18.11.2011
comment
Эти две ссылки также могут быть полезны: cppunit.sourceforge.net/doc/1.8. 0/cppunit_cookbook.html и scorec.rpi. edu/w/images/0/05/GuideToCppUnit.pdf - person Fabio Ceconello; 18.11.2011