C++基础学习之12 - 测试驱动开发
2017-01-12 22:41
429 查看
测试驱动开发,英文全称 Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。
测试驱动开发的基本过程如下:
1. 快速新增一个测试;
2. 运行所有的测试(有时候只需要运行一个或一部分),发现新增的测试不能通过;
3. 做一些小小的改动,尽快地让测试程序可运行,为此可以在程序中使用一些不合情理的方法;
4. 运行所有的测试,并且全部通过;
5. 重构代码,以消除重复设计,优化设计结构简单来说,就是不可运行/可运行/重构——这正是测试驱动开发的口号。
上述定义来自百度百科,感谢 李彦宏。
那么在实际开发中,我们怎么样才能做到这一步呢?我们以下面一个例子来说明:
.h 头文件
.cpp文件
你应该先这样写:
测试驱动开发的基本过程如下:
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,用于测试结果显示!
相关文章推荐
- <Test-Driven Development with Python>学习笔记 第一部分 测试驱动开发基础
- 测试驱动的开发学习笔记
- 程序开发基础学习二(C++ Google Style 命名规则)
- 测试驱动开发学习<一>
- c++基础学习12-c++的多态与继承
- 相关驱动开发工具(系统自带测试驱动工具使用 学习学习)
- 单元测试-----------测试驱动的C/C++程序开发
- 测试驱动开发(tdd) 学习笔记(1)基本思想原则和术语
- 测试驱动开发学习<二>
- 嵌入式开发之C++基础学习笔记5--静态成员,友元,运算符重载,模板,文件流
- 程序开发基础学习二(C++ Google Style 命名规则)
- [MFC学习之C++基础] 孙鑫视频中第三讲中提到的小测试程序(关于基类和子类的继承关系)
- 测试驱动开发(tdd) 学习笔记(1)基本思想原则和术语
- 程序开发基础学习二(C++ Google Style 命名规则)
- 测试驱动开发学习<三> 单元测试
- linux 下块设备驱动开发学习笔记 2(sbull驱动在vmware上测试)
- VS2010 学习笔记 WF4 (5) 加入单元测试,实现测试驱动开发(TDD)
- 程序开发基础学习二(C++ Google Style 命名规则)
- 嵌入式开发之C++基础学习笔记3--面向对象基础
- C++学习笔记2,各基础类型及共用体的长度测试