C++基础学习之12 - 测试驱动开发

来源:互联网 发布:win7如何卸载软件 编辑:程序博客网 时间:2024/04/30 08:05

        测试驱动开发,英文全称 Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。

        测试驱动开发的基本过程如下:

1. 快速新增一个测试;

2. 运行所有的测试(有时候只需要运行一个或一部分),发现新增的测试不能通过;

3. 做一些小小的改动,尽快地让测试程序可运行,为此可以在程序中使用一些不合情理的方法;

4. 运行所有的测试,并且全部通过;

5. 重构代码,以消除重复设计,优化设计结构简单来说,就是不可运行/可运行/重构——这正是测试驱动开发的口号。

        上述定义来自百度百科,感谢 李彦宏。

        那么在实际开发中,我们怎么样才能做到这一步呢?我们以下面一个例子来说明:

.h 头文件

/////////////////////////////////////////////////////////////////////////////////////////////////////////** 线程类*/class ThreadX{public:ThreadX(int nPriority = NormalPriority);~ThreadX();    bool isFinished() const;bool isRunning() const;void start();    void stop();    /** 线程函数*/static void TH_WORK(void *pContex);protected:/** run,inhrit for thread function*/virtual void run()=0;private:bool _beginThread();THREAD_HANDLE  m_hThread;   /**< 线程句柄*/int            m_nPriority; /**< 优先级*/volatile int   m_nRunStatu; /**< 运行状态-0:finished  1:running  2:inFinish*/};

.cpp文件

/** Constructor*/ThreadX::ThreadX(int nPriority)    :m_nPriority(nPriority)    ,m_nRunStatu(0){}ThreadX::~ThreadX(){stop();}bool ThreadX::isFinished() const{return 0==m_nRunStatu;}bool ThreadX::isRunning() const{return 1==m_nRunStatu;}/** start thread*/void ThreadX::start(){if (2==m_nRunStatu) {        //wait(); // todo,wait time until        return;    }if( 1==m_nRunStatu || !_beginThread() )return;}/** stop thread*/void ThreadX::stop(){if (INVALID_TH_HANDLE == m_hThread)return;m_nRunStatu = 2; // inFinish#if (defined _WIN32) || (defined _WINDOWS_)WaitForSingleObject(m_hThread, INFINITE);#elsepthread_join(m_hThread, 0); #endifm_hThread = INVALID_TH_HANDLE;    m_nRunStatu = 0; // thread is finished}/** 线程函数*/void ThreadX::TH_WORK(void *pContex){ThreadX *pThis = (ThreadX *)pContex;    pThis->run(); // 执行运行线程}bool ThreadX::_beginThread(){// thread is running nowm_nRunStatu = 1;#if (defined _WIN32) || (defined _WINDOWS_)m_hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)TH_WORK, this,0,NULL);if (0 == m_hThread)// 创建监听线程失败{m_nRunStatu = 0;return false;}#else/*sched_param param;param.sched_priority = sched_get_priority_max(SCHED_RR);pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setschedpolicy(&attr, SCHED_RR); // SCHED_OTHER(default), [SCHED_FIFO,SCHED_RR](real time for super user only)pthread_attr_setschedparam(&attr, &param);int nRet = pthread_create(&m_hThread, &attr, TH_WORK, this);*/    // 默认属性为非绑定、非分离、默认1MB堆栈、与父进程有相同优先级。int nRet = pthread_create(&m_hThread, NULL, TH_WORK, this);if (0 != nRet) // 创建监听线程失败{m_nRunStatu = 0;return false;}#endifreturn true;}
        对于上面的代码如何测试其准确性呢?不要等到写完代码才想起来测试,拜托!(我估计99%的人都听不进去这个)

        你应该先这样写:

#include "ThreadX.h"int main(int argc, char **argv){ThreadX th1();ThreadX th2();th1.start();th2.start();th1.stop();th2.stop();system("pause");return 0;}
        没错,先写完上述测试例之后,再去填充 ThreadX 吧,ThreadX 里的函数记得打上Log,用于测试结果显示!
2 0