配置测试项目¶
本节主要介绍如何修改测试项目的配置文件 settings.py来修改测试框架的行为。如果需要查询QTA框架的全部配置项,请参考《配置项说明文档》。
配置语法¶
测试项目的配置文件是一个python模块,所以配置项都是python模块的模块变量,如下所示:
DEBUG = True
RUNNER_THREAD_COUNT = 5
LOCAL_REPORT = 'console'
由于使用的是python模块表示,因此需要符合以下要求:
- 需要符合python语法要求
除此之外,对于配置项还需要符合以下要求:
- 配置变量名必须使用大写
- 配置变量名不可以双下划线开头
比如下面的变量都是非法的:
lower_test = 34
__CONFIG = "XXX"
配置文件¶
QTA配置文件分为三种:
- 用户配置文件
- 依赖Egg包的配置文件
- Testbase配置文件(即qtaf_settings模块)
注解
注意依赖Egg包的配置文件只有通过“manage.py installlib”方式安装到测试项目中,其配置文件才会被加载,具体的依赖egg,可以参考exlib下的installed_libs.txt
用户配置文件存放在测试项目的顶层位置;而QTAF配置文件打包在QTAF的egg包中,在QTAF egg包的顶层位置上;如下:
test_proj/
qt4a/
exlib/
qtaf.egg/
testbase/
tuia/
pyqq/
qtaf_settings.py # Testbase配置
qt4i.egg/
qt4i/settings.py # 依赖Egg包的配置文件
mqlib/
mqtest/
settings.py # 用户配置
当两个配置文件中的配置项存在冲突时,按照以下优先级从高到低处理:
- 用户配置文件
- 依赖Egg包的配置文件
- Testbase配置文件
也就是说,用户配置文件可以重载QTAF配置中的默认配置。
配置文件定位¶
上面提到的三种配置文件,对于存在整个工程的情况来说,就可以直接使用,不需要额外处理。 如果想要独立使用qtaf或其他qta的egg模块,可以采用定义环境变量的方式告诉qtaf配置文件的位置:
QTAF_EXLIB_PATH: 指定qta相关egg包存放的路径,qtaf、qt4s、qt4a等egg都会去这里查找,并加载配置
QTAF_INSTALLED_LIBS: 指定已安装并计划使用的第三方模块(即qtaf除外的),多个模块间用分号隔开,例如:qt4s;qt4a;qt4i
QTAF_SETTINGS_MODULE: 指定用户自定义的配置模块,python在运行时可以找到的模块,支持多级路径,例如:myproject.settings_20160705
警告
特别注意,如果环境变量存在,仅仅使用环境变量指定的内容,例如存在QTAF_INSTALLED_LIBS环境变量,就不会使用exlib目录下的installed_libs.txt中的内容了
使用测试配置¶
配置使用的接口统一使用conf接口,如下:
from testbase.conf import settings
if settings.DEBUG:
print 'debug mode'
else:
print 'release mode'
也可以使用get接口查询配置,比如:
from testbase.conf import settings
my_conf = settings.get('MY_SETTING', None)
警告
settings.py和qtaf_settings.py也是可以直接import使用的,但是不建议这样做,如果这样使用,可能会遇到非预期的结果。
注意settings配置不允许动态修改配置的值,如:
settings.DEBUG = False
会导致异常:
Traceback (most recent call last):
File "D:\workspace\qtaftest\test.py", line 17, in <module>
settings.DEBUG = 9
File "build\bdist.win32\egg\testbase\conf.py", line 85, in __setattr__
RuntimeError: 尝试动态修改配置项"DEBUG"
自定义settings所在的文件¶
QTA默认是通过加载Python模块`settings`来读取所有配置,用户可以通过设置环境变量`QTAF_SETTINGS_MODULE`来指定配置项所在的模块名。
比如在测试项目中顶层目录中创建多个配置文件:
用户配置文件存放在测试项目的顶层位置;而QTAF配置文件打包在QTAF的egg包中,在QTAF egg包的顶层位置上;如下:
test_proj/
qt4a/
exlib/
mqlib/
mqtest/
settings/
__init__.py
prod.py #正式环境
test.py #测试环境
比如需要使用正式环境的配置:
$ QTAF_SETTINGS_MODULE=settings.prod python manage.py shell
比如需要使用测试环境的配置:
$ QTAF_SETTINGS_MODULE=settings.test python manage.py shell
使用SettingsMixin¶
SettingsMixin是一个混合类,用于方便地跟用户定义的类进行复合,在定义配置项的时候, 将定义放到lib层,而不是孤立地放在settings.py或配置模块中,再人工进行关联。
定义配置项¶
一个简单的使用例子如下:
from qt4s.service import Channel
from qt4s.conn2 import HttpConn
from testbase.conf import SettingsMixin
class MyChannel(Channel, SettingsMixin):
"""define a pseudo channel
"""
class Settings(object):
MYCHANNEL_URL = "http://www.xxxx.com"
def __init__(self):
self._conn = HttpConn()
def get(self, uri, params):
return self._conn.get(self.settings.MYCHANNEL_URL + uri, params)
MyChannel多重继承了Channel和SettingsMixin,SettingsMixin要求类的内部定义一个Settings类, 这个类定义配置项的规则如下:
- 配置项必须以当前类的名字大写+下划线开头,例如这里的"MYCHANNEL_";
- 配置项的每个字母都必须大写;
- 访问配置项,使用self.settings访问,例如self.settings.MYCHANNEL_URL
重载配置项¶
上面,我们已经知道如何在lib层定义配置项,当需要重载某个配置项的值的时候,在全局配置项里面定义该配置就可以了, 即testbase.conf.settings包含该配置项。lib层的定义跟上面的定义保持一致,而settings.py配置如下
settings.py:
MYCHANNEL_URL = "http://www.oooo.com"
那么在访问self.settings.MYCHANNEL_URL的时候,会优先获取testbase.conf.settings中的配置项。