Python自动化测试代码编码规范
一、适用范围:
本规则基础为Python标准PEP8,在此基础上加了我司测试部编码规范,适用于测试部所有Python脚本编写是采用的规则.
二、编码:
所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- 。设置编辑器,默认保存为 utf-8 格式。
三、注释:
存在技术难点的代码:
采用 # 开头的注释,表明为何选择当前实现以及这种实现的原理和难点。
包、模块、类、函数(方法)使用DocStrings:
文档字符串内部包括内容:
包、模块、类、函数(方法)主要目的,传参类型以及其他需要备注内容。
四、格式:
缩进:
Python 依赖缩进来确定代码块的层次,行首使用4个空格缩进。
换行:
每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车
五、命名:
总体规则:
1)尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
2)尽量使用全拼写的单词,缩写的情况有如下两种:
I.常用的缩写,如 XML、ID等,在命名时也应只大写首字母,如:
classXmlParser(object):pass
II.命名中含有长单词,对某个单词进行缩写。这时应使用约定成俗的缩写方式,如去除元音、包含辅音的首字符等方式,例如:
function 缩写为 fn
text 缩写为 txt
object 缩写为 obj
count 缩写为 cnt
number 缩写为 num,等。
常量:
常量名所有字母大写,由下划线连接各个单词。
变量:
1)使用全部小写的方式,可以使用下划线。
2)全局变量尽量只在模块内有效。
3)__xxx__ 形式的系统保留字命名法,项目中也可以使用。这种形式的变量是只读的,这种形式的类成员函数尽量不要重载。如:
class Base(object):
def __init__(self, id, parent = None):
self.__id__ = id
self.__parent__ = parent
def __message__(self, msgid): # …略
其中 __id__、__parent__ 和 __message__ 都采用了系统保留字命名法。
方法:
方法命名使用全部小写的方式,可以使用下划线。
类:
1)类的命名使用首字母大写,类名已驼峰的方式,模块内部的类在前面加下划线。
2)类的属性若与关键字名字冲突,后缀加一下划线,尽量不要使用缩略等其他方式。
3)类的方法第一个参数必须是self。
4)使用robotFramework时,类名必须与文件名一致。
5)每个类必须继承object
六、语句:
Import:
1)import 的次序,先 import Python 内置模块,再 import 第三方模块,最后 import 自己开发的项目中的其它模块;这几种模块中用空行分隔开来。
2)一条 import 语句 import 一个模块。
3)当从模块中 import 多个对象且超过一行时,使用如下断行法(此语法 py2.5 以上版本才支持):
from module import (obj1, obj2, obj3, obj4,obj5, obj6)
4)不要使用 from module import *。
赋值:
对于赋值语言,主要是不要做无谓的对齐,如:
a = 1 # 这是一个行注释
variable = 2 # 另一个行注释
fn = callback_function # 还是行注释
七、分支和循环:
1)不要写成一行,如:
if not flg: pass 和 for i in xrange(10): print i都不是好代码,应写成
if not flg:
pass
fori in xrange(10):
print i
2)条件表达式的编写应该足够 pythonic,如以下形式的条件表达式是拙劣的:
if len(alist) != 0: do_something()
if alist != []: do_something()
if s != “”: do_something()
if var != None: do_something()
if var != False: do_something()
上面的语句应该写成:
if seq: do_something() # 注意,这里命名也更改了
if var: do_something()
3)用得着的时候多使用循环语句的 else 分句,以简化代码。
Try-except语句:
如需使用try-except语句,遵循以下格式:
try:
…
return True
except:
logger.eception(‘assssss’)
…
return False
fllay{
八、禁用语句:
在robotFramework框架中使用的自定义编写的脚本时,禁止使用sys.exit(0)语句
七、已有代码与第三方模块:
1)对于项目中已有的代码,可能因为历史遗留原因不符合本规范,应当看作特例,允许存在;但不应在新的代码中延续旧的风格。
2)对于第三方模块,可能不符合本规范,也应看作特例,允许存在;但不应在新的代码中使用第三方模块的风格。
九、自动化测试代码开发规则
自动化用例开发我们还需遵守如下规则;
1.每次开发自动化用例前,需先从svn上update以保证为最新的工程项目.要上传代码,必须保证本地调试通过.Case包上传,先使用”清理孤立的用例文件”功能清理无效用例ini文件,再用”同步用例工程”界面操作,保证上传的case必须为最新。自动化代码需做codereview.
2.Logic开发保证run()方法结构如下:
public void run() throws Throwable {
// 步骤一:取得被测试程序引用
// 步骤二:获取用例用到的变量数据
// 步骤三:得到需要用到的AW的实例
// 步骤四:调用方法
}
3.日志/打印信息使用已封装好的Log4J方法,如下例:
private static Logger fLogger = Logger.getLogger(EPMSUtils.class);
4.每个操作点后要加上结果判断,例子如下:
getResult().addChkPnt("创建所有用户组权限用户", TestResult.PASSED, "Create Successfully");
5.对确认的对象等待使用$object.waitForExist();只有在不确认或者认为受机器性能影响处的思考时间使用RationalTestScript.sleep().
6.对可抽象的Selenium方法写在com.tdtech.utils.SeleniumUtils 里面.公用界面AW写在com.tdtech.commonTask 包中.
7.对可抽象的界面AW方法都写对应的Utils类里面,且方法说明清晰易懂.如:
com.tdtech.epms.commonTask.EPMSUtils
com.tdtech.escs.commonTask.ESCSUtils
8.测试代码AW按照每个界面进行分包,包名清晰易懂.如:
com.tdtech.epms.epmsDailyOffice
且每个界面AW要有对应截图,方便界面操作查看以及java doc生成.
9.测试包命名都使用英文字母,按照业务流规则分类, 测试用例命名可直接使用BBT用例名,用例备注中填写此用例在TMSS上的用例ID.用例参数说明清晰明确.
10.各模块用例开发者也需要持续维护所有负责的用例.执行者需对失败用例进行初步分析,得出结论:软件控件变化,用例逻辑错误,用例代码问题.