nose也是python里面用得比较多的一个测试框架。
先安装setuptools,在网上下载ez_setup.py,然后在cmd下,进入到ez_setup.py所在的目录,然后执行python ez_setup.py即可。安装nose到时候可以直接将nose包下载下来,在cmd下,运行python setup.py install。也可以打开cmd-->进入命令提示行,此时保持电脑可以上外网,在命令提示行中输入 C:\Python33\Scripts\easy_install nose 回车,此时会从网上自动下载东西,不用管它,Nose会自动安装完成。前提是安装好了setuptools,要不安装的时候会提示找不到setuptools modules
安装之后不知道为什么,不能像python自带的包那样直接import进来,还需要sys.path.append将路径加入进来。在我的电脑--》属性--》高级属性--》环境变量--》path里面也将路径加入进去,可不知道为什么还是不行。安装selenium的时候将环境变量设置好后就ok了。
如果要想以命令行的方式运行nosetests,则将nosetests.exe的目录添加到环境变量path里面去后才能运行。
可以通过nosetests -h查看nosetests的各个参数。常见的有:
a) -w WHERE,指定一个目录运行测试。目录可以是相对路径或绝对路径。
例如: nosetest -w C:\Users\shunelly\Desktop\02,可以指定多个目录,例如: nosetest -w C:\Users\shunelly\Desktop\02 -w C:\Users\shunelly\Desktop\03。
b)-s,不捕获输出,会让你的程序里面的一些命令行上的输出显示出来。例如print所输出的内容。
c)-v,be more verbose
d)-m REGEX,指定搜索测试用例的匹配正则表达式。
e)--doctest-tests
也可以通过以下方式运行
if __name__=="__main__":
import nose
nose.run(argv=["","RomanNumeralConverterTest.py","--verbosity=2"]
搜索规则:指定的目录不管是不是模块(包含有__init__.py),都会搜索。
如果目录下文件夹不满足正则表达式匹配规则,则文件夹下文件都不会搜索。同理如果文件命名不满足匹配规则,则下面类、函数都不会被搜索。继承自unittest.TestCase的测试类,不管类名是不是符合匹配规则,只要下面的测试用例满足匹配规则都会被会作为测试用例运行。非继承自unittest.TestCase的类如果类名不符合匹配规则,则下面函数都不会被搜索。写了这么长一段,也不知道表达清楚搜索规则没有,如果有不清楚的,再自己的电脑上试一试就知道啦。
nose的口号是扩展的unittest,让测试更简单。
进入到nose的安装目录查看源代码就可以看出,其TestLoader,TestTestResult,TextTestRunner等都是从unittest继承过来的。
class TestLoader(unittest.TestLoader):
try:
# 2.7+
from unittest.runner import _TextTestResult
except ImportError:
from unittest import _TextTestResult
class TextTestResult(_TextTestResult):
class TextTestRunner(unittest.TextTestRunner):
nose还有一大好处是可以方便的添加我们自己写的插件以增强测试管理或者方便我们的测试。下面这个例子是添加一个插件,插件的作用的将运行后的测试结果保存在以.csv为后缀的文件中。
import nose
import re
from nose.plugins import Plugin
class CsvReport(Plugin):
name = "csv-report"
def __init__(self):
Plugin.__init__(self)
self.results = []
def options(self, parser, env):
Plugin.options(self, parser, env)
parser.add_option("--csv-file",
dest="filename", action="store",
default=env.get("NOSE_CSV_FILE", "log.csv"),
help=("Name of the report"))
def configure(self, options, conf):
Plugin.configure(self, options, conf)
self.filename = options.filename
def addSuccess(self, *args, **kwargs):
test = args[0]
self.results.append((test, "Success"))
def addError(self, *args, **kwargs):
test, error = args[0], args[1]
self.results.append((test, "Error", error))
def addFailure(self, *args, **kwargs):
test, error = args[0], args[1]
self.results.append((test, "Failure", error))
def finalize(self, result):
report = open(self.filename, "w")
report.write("Test,Success/Failure,Details\n")
for item in self.results:
if item[1] == "Success":
report.write("%s,%s\n" % (item[0], item[1]))
else:
report.write("%s,%s,%s\n" % (item[0],item[1],\
item[2][1]))
report.close()
if __name__ == "__main__":
args = ["", "recipe14", "--with-csv-report", \
"--csv-file=recipe14.csv","-v"]
nose.run(argv=args, plugins=[CsvReport()])
总结:nose对unittest和doctest的支持比较好。
nose可以更好的将测试代码和源代码分离开来。
支持定制和扩展。