Python——极限编程
很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——极限编程的更多相关文章
- Python演讲笔记1
参考: 1. The Clean Architecture in Python (Brandon Rhodes) 2. Python Best Practice Patterns (Vladimir ...
- [转] Python自动单元测试框架
一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software ...
- PYTHON单元测试
PYTHON开发入门与实战11-单元测试 1. 单元测试 本章节我们来讲讲django工程中如何实现单元测试,单元测试如何编写以及在可持续项目中单元测试的重要性. 下面是单元测试的定义: 单元测试是开 ...
- Python单元测试框架
目录 概况 系统要求 使用PyUnit构建自己的测试 安装 测试用例介绍 创建一个简单测试用例 复用设置代码:创建固件 包含多个测试方法的测试用例类 将测试用例聚合成测试套件 嵌套测试用例 测试代码的 ...
- Python PEP-8编码风格指南中文版
#PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...
- 面试问题整理之python测试
1.下列哪个语句在Python中是非法的? A.x = y = z =1 B.x = (y = z + 1) C.x, y = y, x D.x += y 答案:B 2.关于Python内存管理,下列 ...
- IEEEXtreme 极限编程大赛题解
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 IEEEXtreme全球极限编程挑战赛,是由IEEE主办,IEEE学生分会组织承办.IEEE会员参与指导和监督的.IEEE学生会员以团队 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
随机推荐
- 【最大独立集】BZOJ3175- [Tjoi2013]攻击装置
[题目大意] 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2, ...
- 精通android体系架构、mvc、常见的设计模式、控制反转(ioc)
1.请看某个著名的it公司一则招聘信息的其中一条要求:“熟悉android系统架构及相关技术,1年以上实际android平台开发经验:”,里面非常明确的说道要求熟练android系统架构,这从某种程度 ...
- [bzoj1019][SHOI2008]汉诺塔 (动态规划)
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...
- [bzoj1015](JSOI2008)星球大战 starwar(离线+并查集)
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武 器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...
- PHP -- 模拟测试上传文件
FROM :http://web.itivy.com/article-740-1.html QQ上传文件为什么那么快? “QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有 ...
- CDOJ 1314 Hash Perfectly FFT
Hash Perfectly 题目连接: http://acm.uestc.edu.cn/#/problem/show/1314 Description In computing, a hash ta ...
- 将多层级xml解析为Map
/** * 解析xml的工具类 * 1.将多层级xml解析为Map */ public class ParseXmlUtil { public static final String TAG = &q ...
- 学习笔记:Tab Bar 控件使用详解
注意这里是:Tab Bar 不是Tab Bar Controller. Tab bar是继承UIView,所以可以添加到ViewController里.是View就可以add到另一个View上去.Ta ...
- Cocos2d-x3.0 解压zip
2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...
- Ext Connection
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...