EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++

Можно ли улучшить мой первый юнит-тест с применением boost::test?

Прошу сделать code-review и посоветовать что-либо улучшить.


Приведенный ниже код unit-теста выполняет проверку корректность записи обновленного хидера в файл классом CustomImage32.

Алгоритм теста проста: Если значения в хидере изменить, записать в файл, то после последующего чтения они должны совпадать с теми что были заданы в хидере перед записью в файл.

struct Correct32Fixture
{
    Correct32Fixture()
        : outputfile( string(OUTPUT_FILES_DIR) + string("Correct32.bin") )
    {
        string sourcefile( string(TEST_SAMPLES_DIR) + string("Correct32.bin") );
        std::remove( outputfile.c_str() );
        copy_file( path(sourcefile), path(outputfile) );
        fileRaw =  new fstream( outputfile.c_str(), ios::in | ios::out | ios::ate | ios::binary );
        filePtr = InOutStreamPtr( fileRaw );
        templateImg.setStream( filePtr );
        templateImg.read();
    }
    ~Correct32Fixture()
    {
        if(fileRaw->is_open() )
        {
            fileRaw->close();
        }
        std::remove( outputfile.c_str() );
    }
    string          outputfile;
    fstream*        fileRaw;
    InOutStreamPtr  filePtr; // InOutStreamPtr это boost::shared_ptr<std::iostream>
    CustomImage32   templateImg;
};
BOOST_FIXTURE_TEST_CASE( testSuperHeaderChanghing, Correct32Fixture )
{
    BOOST_REQUIRE( templateImg.SuperHeader().boundary_field1 == 0x90 );
    BOOST_REQUIRE( templateImg.SuperHeader().boundary_field2[9] == 0 );
    // Arrange
    templateImg.SuperHeader().boundary_field1 = 0xE9;
    templateImg.SuperHeader().boundary_field2[9] = 0xE8E9;
    templateImg.write();
    // Act
    fileRaw->close();
    fstream* fileRaw2 = new fstream( outputfile.c_str(), ios::in | ios::ate | ios::binary );
    InOutStreamPtr filePtr2( fileRaw2 );
    CustomImage32 checkImg( filePtr2 );
    //Assert
    BOOST_CHECK( checkImg.SuperHeader().boundary_field = 0xE9 );
    BOOST_CHECK( checkImg.SuperHeader().boundary_field[9] = 0xE8E9 );
}
  • Вопрос задан
  • 3403 просмотра
Пригласить эксперта
Ответы на вопрос 1
prograholic
@prograholic
Замечание насчет exception safety + RAII:
Если вы используете boost::shared_ptr, то логично создавать объекты с помощью std::make_shared, а не использовать для этого сырой указатель (fileRaw и fileRaw2):
filePtr = boost::make_shared<std::fstream>( outputfile.c_str(), ios::in | ios::out | ios::ate | ios::binary );
. Ну и выкинуть использование fileRaw и fileRaw2.

Код юнит-теста — это тоже код, поэтому лучше не использовать в тесте магических констант: 0xE9 и пр.
Вынесите их в отдельное пространство имен:
namespace consts
{
  const int ConstantName = 0xE9;
  const char OutputFileName [] = "Correct32.bin";
}
Естественно, при этом константам дать осмысленные имена.

Также, я бы не стал использовать в юнит-тесте работу с файлами, вместо этого я бы использовал std::streambuf для чтения/записи данных в памяти — но это возможно, если в вашей программе есть механизм для ввода/вывода не только через fstream
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы