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

        测试驱动开发,英文全称 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);
#else
	pthread_join(m_hThread, 0); 
#endif
	
	m_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 now
	m_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, ¶m);
	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;
	}
#endif

	return 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,用于测试结果显示!

你可能感兴趣的:(C++,设计模式)