CPPUnit, как мне написать тест? - PullRequest
4 голосов
/ 17 ноября 2011

Ладно, я в основном хочу начать игру и написать несколько тестов 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;
}

1 Ответ

4 голосов
/ 17 ноября 2011

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

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

Для второго примера, который вы привели, первым делом нужно определить проверку достоверности для метода 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();
}
...