測試
在開發的過程中, 測試是非常重要的.測試需要重複檢查, 它是一個煩人的過程.出於這個原因, 自動處理這個過程就變得非常有用了.
模型(model)的單元測試
在這一節總, 我們將嘗試檢查模型(model)是否工作在正確的方式.測試框架使用了Qt的TestLib(更多詳細信息,請查看文檔).讓我們測試教程中生成的Blog模型(model)的代碼.先提前爲模型(model)生成一個共享庫.首先, 我們在test目錄下創建工作目錄.
$ cd test
$ mkdir blog
$ cd blog
我們將嘗試創建 生成和讀取Blog模型的測試用例.
例如, 我們設置實現測試的名字爲TestBlog.下面內容的源代碼保存在名爲testblog.cpp的文件中.
#include <TfTest/TfTest>
#include "models/blog.h" // 包含模型類
class TestBlog : public QObject
{
Q_OBJECT
private slots:
void create_data();
void create();
};
void TestBlog::create_data()
{
// 定義測試數據
QTest::addColumn<QString>("title");
QTest::addColumn<QString>("body");
//增加測試數據
QTest::newRow("No1") << "Hello" << "Hello world.";
}
void TestBlog::create()
{
// 獲取測試數據
QFETCH(QString, title);
QFETCH(QString, body);
//測試的邏輯
Blog created = Blog::create(title, body);
int id = created.id();
Blog blog = Blog::get(id); // 獲取模型 ID
//檢查結果的執行
QCOMPARE(blog.title(), title);
QCOMPARE(blog.body(), body);
}
TF_TEST_MAIN( TestBlog)// 指定你創建的類名
#include "testblog.moc" // 宏. Make .moc擴展
作爲補充說明, create()方法可以執行這個測試, QCOMPARE宏可以檢查實際返回的值.create_data()方法傳遞測試數據.規則是在方法名後名添加’_data”.在這個例子, 我在create_data()方法中執行下面的內容.
- QTest::addColumn() function: 定義名字和測試數據的類型.
- QTest::newRow() function: 添加測試數據.
下面是在create()方法中執行的.
- 獲取測試數據
- 執行測試邏輯
- 檢查結果是否正確.
接下來, 創建一個項目文件來生成Makefile.文件名是testblog.pro. 保存下面的內容.
TARGET = testblog
TEMPLATE = app
CONFIG += console debug qtestlib
CONFIG -= app_bundle
QT += network sql
QT -= gui
DEFINES += TF_DLL
INCLUDEPATH += ../..
LIBS += -L../../lib -lmodel
include(../../appbase.pri)
SOURCES = testblog.cpp # 指定文件名
Qt5以後有些規範已經更改了.如果使用Qt5, 請更改上面的第5行如下.
QT += network sql testlib
在你保存項目文件後, 你可以通過下面的命令在目錄生成一個二進制文件.
$ qmake
$ make
接下來, 要執行測試過程,一些配置需要完成.因爲需要引用各種配置文件, 測試命令需要一個配置目錄的符號連接.它的位置應該直接在測試命令下.當使用SQLite數據庫時, 我們也需要生成一個符號連接到db文件夾.
$ ln -s ../../config config
$ ln -s ../../db db
如果你使用window, 一個測試的exe文件在debug文件夾內生成, 故在那裏生成符號連接.請注意: 它不是一個快捷方式.要創建一個符號連接, 必須有管理員權限從命令行窗口運行命令.
> cd debug
> mklink /D config ..\..\..\config
> mklink /D db ..\..\..\db
還有, 將Blog模型的路徑增加到共享庫路徑.
在Linux中, 設置環境變量如下:
$ export LD_LIBRARY_PATH=/path/to/blogapp/lib
如果使用Windows, 將設置添加到PATH變量,如下:
> set PATH=C:\path\to\blogapp\lib;%PATH%
然後檢查數據庫的連接信息.在測試單元中, 在數據庫配置文件(database.ini)的test節中的連接信息被使用.
[test]
DriverType=QMYSQL
DatabaseName=blogdb
HostName=
Port=
UserName= root
Password=
ConnectOptions=
配置現在完成了.接下來, 測試需要被執行.如果測試從頭到尾都是成功的, 你可以在屏幕上看到下面的信息.
$ ./testblog
********* Start testing of TestBlog *********
Config: Using QTest library 4.8.3, Qt 4.8.3
PASS : TestBlog::initTestCase()
PASS : TestBlog::create()
PASS : TestBlog::cleanupTestCase()
Totals: 3 passed, 0 failed, 0 skipped
********* Finished testing of TestBlog *********
在Windows中, 請在Treefrog命令行串口執行命令.
然而, 如果結果不是期望的那樣, 你將會看到如下信息.
********* Start testing of TestBlog *********
Config: Using QTest library 4.8.3, Qt 4.8.3
PASS : TestBlog::initTestCase()
FAIL!: TestBlog:: create( No1) Compared values are not the same
Actual (blog.body()): foo bar.
Expected (body): Hello world.
Loc: [testblog.cpp(33)]
PASS : TestBlog::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped
********* Finished testing of TestBlog *********
爲每個模型生成一個測試用例, 然後執行這個測試.一個好的網頁應用開發的關鍵是確保模型(model)正確工作.