很cool的名字,极限编程(Extreme Programming,简写XP)是编程的一种流行趋势:
(1)首先是对目标进行计划;
(2)然后将测试用例集合编写为一种框架;
(3)之后才编写实际的代码。
在完成实际代码后的任何时候,都可以运行测试用例以查看接近设计目标的程度,该测试套件具体体现了这个设计目标,同时也在调式和测试软件,非常的nice。
****************************************************************************************************
下面是一个实际的例子,完成一个和Unix中find和grep结合的工具
可以指定 文件名 文件内容 扩展名 搜索目录 进行搜索,返回合适的文件信息
----------------------------------------------------------------------
第一步是需要分析,对结果做初步规划:
(1)返回形式:(path , filename , 扩展名 , 文件大小)的元组;
(2)输入参数:搜索文件名的regex 和 内容地regex;
(3)其它搜索项:文件大小,存在时间,最近一次修改信息等(介个以后再说)
-----------------------------------------------------------------------
第二步是极限编程的特色,按照设计好的接口,完成测试代码:
(这里是个作弊的行为,因为实践中不可能一次性的将测试代码全部完成)
1 #!/usr/bin/python
2 # -- coding: utf-8 --
3 #============================================
4 #FileName: test_find.py
5 #Date: 2013年 06月 04日 星期二 09:29:20 CST
6 #Author: chenhuan
7 #Usage: unittest test file of find.py
8 #============================================
9
10 import unittest
11 import find
12 import os , os.path
13 import shutil
14
15 #============================================================
16 class TestFind(unittest.TestCase) :
17 """
18 TestFind - test the find module. It has five parts to test
19 1. testSearchAll - search the .*
20 2. testSearchFile - search as the input filename
21 3. testSearchContent - search as the content
22 4. testSearchExtension - search as the extension name
23 5. testSearchLogic - search as the logic
24
25 find(fileName , content , start)
26 return ([path , fileName , extension , fileSize]...)
27 """
28
29 #--------------------------------------------------
30 def __getFileName(self , fileInfo) :
31 """
32 __getFileName - return the filename
33 fileInfo - the result return by find
34 """
35 return fileInfo[1]
36
37
38 #--------------------------------------------------
39 def setUp(self) :
40 """
41 setUp - build up the test files as follows
42 1. _test/file_1.txt "chenhuan"
43 1. _test/file_2.py "wuxiaoqin"
44 2. _test/dir_1/file_1.cpp "#include <stdio.h>"
45 3. _test/dir_2/file_1.py "wuxiaoqin"
46 """
47 try :
48 os.mkdir('./_test')
49 os.mkdir('./_test/dir_1')
50 os.mkdir('./_test/dir_2')
51 except :
52 pass
53
54 f = open('./_test/file_1.txt','w')
55 f.write('chenhuan')
56 f.close()
57
58 f = open('./_test/file_2.py','w')
59 f.write('wuxiaoqin')
60 f.close()
61
62 f = open('./_test/dir_1/file_1.cpp','w')
63 f.write('#include<stdio.h>')
64 f.close()
65
66 f = open('./_test/dir_1/file_1.py','w')
67 f.write('wuxiaoqin')
68 f.close()
69
70 #-------------------------------------------------
71 def tearDown(self) :
72 """
73 tearDown - remove all the test files
74 """
75 shutil.rmtree('./_test')
76
77 #-------------------------------------------------
78 def testSearchAll(self) :
79 """
80 testSearchAll - find all the files under pointed directory
81 """
82 filesInfo = find.find(fileName=r".*" , start="_test")
83 self.failUnless(map(self.__getFileName , filesInfo).sort() ==
84 ['file_1.txt','file_2.py','file_1.cpp','file_1.py'].sort(),
85 'Error in testSearchAll')
86
87 #----------------------------------------------------
88 def testSearchFile(self) :
89 """
90 testSearchFIle - find the pointed file
91 """
92 filesInfo = find.find(fileName=r"file_1.*" , start='_test')
93 self.failUnless(map(self.__getFileName , filesInfo).sort() ==
94 ['file_1.txt' , 'file_1.cpp' , 'file_1.py'].sort() ,
95 'Error in testSearchFile')
96
97
98 filesInfo = find.find(fileName=r"file_1.txt" , start='_test')
99 self.failUnless(map(self.__getFileName , filesInfo) ==
100 ['file_1.txt'] , 'Error in testSearchFile')
101
102 filesInfo = find.find(fileName=r"file_2.txt" , start='_test')
103 self.failUnless(map(self.__getFileName , filesInfo) ==
104 [] , 'Error in testSearchFile')
105
106 #----------------------------------------------------
107 def testSearchContent(self) :
108 """
109 testSearchContent - find the files which contains pointed content
110 """
111 filesInfo = find.find(content = 'wuxiaoqin' , start='_test')
112 self.failUnless(map(self.__getFileName , filesInfo).sort() ==
113 ['file_2.py' , 'file_1.py'].sort() ,
114 'Error in testSearchContent')
115
116 filesInfo = find.find(content = r'include' , start='_test')
117 self.failUnless(map(self.__getFileName , filesInfo) ==
118 ['file_1.cpp'] , 'Error in testSearchContent')
119
120 filesInfo = find.find(content = r'wu.*qin' , start='_test')
121 self.failUnless(map(self.__getFileName , filesInfo).sort() ==
122 ['file_1.py' , 'file_2.py'].sort() ,
123 'Error in testSearchContent')
124
125 #-------------------------------------------------------
126 def testSearchExtension(self) :
127 """
128 testSearchExtension - find the files by the extension name
129 """
130 filesInfo = find.find(extension='txt' ,start='_test')
131 self.failUnless(map(self.__getFileName , filesInfo).sort() ==
132 ['file_1.txt','file_2.txt'].sort() ,
133 'Error in testSearchExtension')
134
135 filesInfo = find.find(content='chenhuan' , extension='txt' ,
136 start='_test')
137 self.failUnless(map(self.__getFileName , filesInfo) ==
138 ['file_1.txt'] , 'Error in testSearchExtension')
139
140 #=====================================================
141 if name == 'main' :
142 unittest.main()


第三步开始才是真正的需要实现功能的代码,实际上这一块和测试代码一道,是一个缓慢发展的过程:
1 #!/usr/bin/python
2 # -- coding: utf-8 --
3 #============================================
4 #FileName: find.py
5 #Date: 2013年 06月 04日 星期二 09:29:55 CST
6 #Author: chenhuan
7 #Usage: find to search the file as dir regex
8 #and content regex
9 #============================================
10
11 import os
12 import os.path
13 import re
14 from stat import
15
16 #---------------------------------------------------------
17 def find(fileName=r'.
' , content=None , extension=None , start='.') :
18 """
19 find - find the file named 'fileName' which contains the
20 'content' under the 'start' path, 'extension' means the suffix
21 """
22 context = {}
23 context['fileName'] = fileName
24 context['content'] = content
25 context['extension'] = extension
26 context['return'] = []
27
28 os.path.walk(start , findFile , context)
29
30 return context['return']
31
32 #----------------------------------------------------------
33 def findFile(context , dirName , files) :
34 """
35 findFile - return the fileInfo which match the context
36 """
37 for file in files :
38 path = os.path.join(dirName,file)
39 path = os.path.normcase(path)
40
41 fileInfo = os.stat(path)
42 size = fileInfo.st_size
43
44 #ignore directorys
45 if S_ISDIR(fileInfo.st_mode) :
46 continue
47
48 try :
49 extension = os.path.splitext(file)[1][1:]
50 except :
51 extension = ''
52
53 #do filtration based on the fileName
54 fileNameP = re.compile(context['fileName'])
55 if not fileNameP.search(file):
56 continue
57
58 #do filtration based on extension
59 if context['extension'] :
60 extensionP = re.compile(context['extension'])
61 if not extensionP.search(extension) :
62 continue
63
64 #do filtration based on the contents
65 if context['content'] :
66 f = open(path , 'r')
67 fileContentP = re.compile(context['content'])
68 matchFlag = False
69 for line in f.readlines() :
70 if fileContentP.search(line) :
71 matchFlag = True
72 break
73 f.close()
74 if not matchFlag :
75 continue
76
77 #Build the return value
78 fileReturn = (path , file , extension ,size)
79 context['return'].append(fileReturn)


结果直接运行test_find.py就可以了,调式了半天,当然是没有啥错误:
Python:极限编程

极限编程的优点是在开始真正的coding之前,需要有一个清晰的需求分析和接口设计,这是我的大短板。感觉从学习Python开始,越来越习惯于接受知识,而不是去思考自己的方案,有点像Matlab,过分的依赖于各种库。thinking~~~thinking~~~thinking才是王道,工具只是用来实现自己想法的,别舍本逐末~~~

Python——极限编程的更多相关文章

  1. Python演讲笔记1

    参考: 1. The Clean Architecture in Python (Brandon Rhodes) 2. Python Best Practice Patterns (Vladimir ...

  2. [转] Python自动单元测试框架

    一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software ...

  3. PYTHON单元测试

    PYTHON开发入门与实战11-单元测试 1. 单元测试 本章节我们来讲讲django工程中如何实现单元测试,单元测试如何编写以及在可持续项目中单元测试的重要性. 下面是单元测试的定义: 单元测试是开 ...

  4. Python单元测试框架

    目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...

  5. Python PEP-8编码风格指南中文版

    #PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...

  6. 面试问题整理之python测试

    1.下列哪个语句在Python中是非法的? A.x = y = z =1 B.x = (y = z + 1) C.x, y = y, x D.x += y 答案:B 2.关于Python内存管理,下列 ...

  7. IEEEXtreme 极限编程大赛题解

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 IEEEXtreme全球极限编程挑战赛,是由IEEE主办,IEEE学生分会组织承办.IEEE会员参与指导和监督的.IEEE学生会员以团队 ...

  8. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  9. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

随机推荐

  1. dubbo基础(初学习dubbo)

    1. 扩展   Soap是webService协议.是http+xml. Rest ful是http+json.相对于soap来说rest ful就是轻量的,因为==.   Rpc与soa区别? Rp ...

  2. bozj 1449/2895: 球队预算 -- 费用流

    2895: 球队预算 Time Limit: 10 Sec  Memory Limit: 256 MB Description 在一个篮球联赛里,有n支球队,球队的支出是和他们的胜负场次有关系的,具体 ...

  3. ThinkPHP -- 去除URL中的index.php

    原路径是 http://localhost/test/index.php/index/add 想获得的地址是 http://localhost/test/index/add 那么如何去掉index.p ...

  4. visual stuidio2010 在iis中调试。

    1 你的电脑装好IIS. 这是必须的. 2.更改.NET Framework 版本为你的项目所用的版本. 应用程序池对应的.NET Framework 版本也都要对应. 3将你电脑的默认网站目录定位到 ...

  5. mui 页面滚动解决方案

    默认情况下mui 页面不能滚动,以下为解决方案: 1. mui('.mui-scroll-wrapper').scroll({  deceleration: 0.0005 //flick 减速系数,系 ...

  6. CentOS下的yum upgrade和yum update区别,没事别乱用,和Ubuntu的update不一样!

    说明:生产环境对软件版本和内核版本要求非常精确,别没事有事随便的进行yum update操作!!!!!!!!! yum update:升级所有包同时也升级软件和系统内核 yum upgrade:只升级 ...

  7. OpenWrt防火墙配置(极路由)

    说明: 1.极路由使用的是OpenWrt做为操作系统,本身就是一个Linux,包管理使用opkg,只是改了一个界面而已. 2.Linux下的防火墙最终都会归iptables进行管理,OpenWrt的防 ...

  8. django safe 过滤器--不对字符串进行转义(转)

    unix下的binutils短小精悍,用胶水(俺经常成管道为胶水)紧密结合在一起释放巨大的能量.django的过滤器也学习了这个方式,每个版本的django都自带了一些builtin的filter,当 ...

  9. ida sdk add_struc_member array

    tid_t tid = get_struc_id ( "foo_type" ) ; struc_t * sptr = get_struc ( tid ); if ( sptr == ...

  10. mysql-bin.000001

    今天发现/usr/local/mysql/var下很多mysql-bin.000001.mysql-bin.000002文件,GOOGLE之..这是数据库的操作日志,例如UPDATE一个表,或者DEL ...