[QTestLib] QTestLibを使ってみる3(static関数のテスト)

static関数のテスト。

ソースファイルをインクルードしてしまえばいい。

って聞いたので、やるまでもないけどやってみた。

0. テスト対象

普通のADD関数。

sample.cpp
static int staticMethod( const int x, const int y )
{
    return x + y;
}

1. テストコード

普通にソースファイルをインクルードするだけ。

tst_staticmethodtest.cpp
#include <QtCore/QString>
#include <QtTest/QtTest>

#include "sample.cpp"

class StaticMethodTest : public QObject
{
    Q_OBJECT

public:
    StaticMethodTest();

private Q_SLOTS:
    void test_staticMethod();
};

StaticMethodTest::StaticMethodTest()
{
}

void StaticMethodTest::test_staticMethod()
{
    QCOMPARE( staticMethod(1,2), 3 );
    QCOMPARE( staticMethod(3,4), 7 );
    QCOMPARE( staticMethod(5,6), 11 );
}

QTEST_APPLESS_MAIN(StaticMethodTest);

#include "tst_staticmethodtest.moc"

ソースファイルをインクルード・・・キモイ・・・



[QTestLib] QTestLibを使ってみる2(privateメソッドのテスト)

privateメソッドのテストコードを書こうとすることは邪道かもしれないけど、書きたくなる場合もあるんじゃないかな? すごく長いメソッドだったり、すごく複雑だったり、すごくスパゲッティだったりさ。

で、privateメソッドのテストコードの書き方を考えていたら、

privateをpublicにdefineすればいいよ

と、C言語erから悪魔のささやきを得たので試してみた。

0. テスト対象

privateメソッドを有する次のようなクラスを対象とする。
自身のメンバ変数の値を取得するprivateメソッドとかすごくバカっぽい・・・
もう少しまともなサンプル思いつかなかったのかと後悔・・・

sampleclass2.h
#ifndef SAMPLECLASS2_H
#define SAMPLECLASS2_H

class SampleClass2
{
public:
    SampleClass2();
    SampleClass2( const int data );
    virtual ~SampleClass2();

private:
    int privateMethod() const;

private:
    int m_data;
};

#endif // SAMPLECLASS2_H
sampleclass2.cpp
#include "sampleclass2.h"

SampleClass2::SampleClass2()
    : m_data()
{
}

SampleClass2::SampleClass2( const int data )
    : m_data(data)
{
}

SampleClass2::~SampleClass2()
{
}

int SampleClass2::privateMethod() const
{
    return m_data;
}

1. テストコード

言われた通りにprivateをpublicにdefineして、テストクラスからprivateメソッドを呼べるようにする。

tst_privatemethodtest.cpp
#include <QtCore/QString>
#include <QtTest/QtTest>

#define private public
#include "sampleclass2.h"
#undef  private

class PrivateMethodTest : public QObject
{
    Q_OBJECT

public:
    PrivateMethodTest();

private Q_SLOTS:
    void test_privateMethod();
};

PrivateMethodTest::PrivateMethodTest()
{
}

void PrivateMethodTest::test_privateMethod()
{
    SampleClass2 obj(10);
    QCOMPARE( obj.privateMethod(), 10 );
}

QTEST_APPLESS_MAIN(PrivateMethodTest);

#include "tst_privatemethodtest.moc"

一応これでprivateメソッドもテストできるけど・・・

あるメソッドがキモくてキモくて仕方がなくて、動作があやしくて、privateだけど仕方なく無理やりテストしようかなって場合はこれでいいかもね。



[QTestLib] QTestLibを使ってみる

テストコードなんて書いたことないので書いてみようかなと思ったけど、わざわざテストフレームワークインストールするのもメンドクサイので、Qt標準ライブラリのQTestLibをヘルプを見ながら使ってみた。

0. テスト対象の準備

テスト対象として、次のようなSampleClassクラスを準備した。

sampleclass.h
#ifndef SAMPLECLASS_H
#define SAMPLECLASS_H

class SampleClass
{
public:
    SampleClass();
    SampleClass( const double data );
    SampleClass( const SampleClass& rhs );
    virtual ~SampleClass();

public:
    SampleClass operator = ( const SampleClass& rhs );

public:
    bool isPositive() const;
    double data() const;

private:
    double m_data;
};

#endif // SAMPLECLASS_H
sampleclass.cpp
#include "sampleclass.h"

SampleClass::SampleClass()
    : m_data()
{
}

SampleClass::SampleClass( const double data )
    : m_data(data)
{
}

SampleClass::SampleClass( const SampleClass& rhs )
    : m_data(rhs.m_data)
{
}

SampleClass::~SampleClass()
{
}

SampleClass SampleClass::operator = ( const SampleClass& rhs )
{
    m_data = rhs.m_data;
    return *this;
}

bool SampleClass::isPositive() const
{
    return ( m_data >= 0.0 ) ? true : false;
}

double SampleClass::data() const
{
    return m_data;
}

1. テストプロジェクトの作成

「Qtユニットテスト」を選んでプロジェクトを作成し、後は適当に選んでいくだけ。
テストクラスのひな型が自動で作成される。

2. テストコードの実装

SampleClass::isPositive()のテストコードとして、

  1. test_isPositive_data()
  2. test_isPositive()

を書いてみた。

tst_sampletest.cpp
#include <QtCore/QString>
#include <QtTest/QtTest>

#include "sampleclass.h"

class SampleTest : public QObject
{
    Q_OBJECT

public:
    SampleTest();

private Q_SLOTS:
    void test_isPositive_data();
    void test_isPositive();
};

SampleTest::SampleTest()
{
}

void SampleTest::test_isPositive_data()
{
    QTest::addColumn<double>("input");
    QTest::addColumn<bool>("expected");

    QTest::newRow("case1") << -1.0 << false;
    QTest::newRow("case2") <<  0.0 << true;
    QTest::newRow("case3") <<  1.0 << true;
}

void SampleTest::test_isPositive()
{
    QFETCH( double, input );
    QFETCH( bool, expected );

    SampleClass obj( input );

    QCOMPARE( obj.isPositive(), expected );
}

QTEST_APPLESS_MAIN(SampleTest);

#include "tst_sampletest.moc"

後はこれをビルドして実行するだけ。

実行結果
********* Start testing of SampleTest *********
Config: Using QTest library 4.7.3, Qt 4.7.3
PASS   : SampleTest::initTestCase()
PASS   : SampleTest::test_isPositive()
PASS   : SampleTest::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of SampleTest *********

他のテストフレームワークを使ったことがないので比較は出来ないけど、まあ、簡単なんじゃないかな?

[備忘録] PSVitaでセーフモード

PSボタンとRボタンを押しながら主電源ON

メニューは、

  1. PS Vitaを再起動する
  2. データベースを再構築する
  3. メモリーカードをフォーマットする
  4. PS Vitaを初期化する
  5. システムソフトウェアをアップデートする