美文网首页自动化
基于Python+Nose的测试框架

基于Python+Nose的测试框架

作者: 佛系小懒 | 来源:发表于2020-02-06 19:42 被阅读0次

nose环境准备

pip3.5 install nose nose_html_reporting  nose_itt  nosehtmloutput-2 nose-html-reporting  tox

中间过程可以通过pip3.5 search nose 查看nose的插件

中间过程如果出现Unable to load plugin html = nose_html_reporting :HtmlReport:No module named 'StringIO',版本问题,现在暂时还没有找到很好的解决方案;需要重新安装nose及插件

nose运行测试

nosetests命令

以使用配置文件,将需要运行的参数放入,配置文件的文件名为nose.cfg 或者 setup.cfg,如果通过tox运行,不希望使用全局配置,可以添加NOSE_IGNORE_CONFIG_FILES变量,设置要忽略的配置文件

nosetests 模块名 --with-html-output  --html-out-file=nose_report.html

通过-s进行代码中print语句的输出,否则只会有测试结果的输出,不会有代码中print对应的日志输出

命令选项

-V, --version 输出 nose version and exit

-p, --plugins 输出可用plugins and exit. Combine with higher verbosity for greater detail

-v=DEFAULT, --verbose=DEFAULT more verbose. [NOSE_VERBOSE]

--verbosity=VERBOSITY Set verbosity; –verbosity=2 is the same as -v

-q=DEFAULT, --quiet=DEFAULT less verbose

-c=FILES, --config=FILES 从config文件中加载配置. 多次、组合使用

-w=WHERE, --where=WHERE 搜索测试用例的目录. [NOSE_WHERE]

--py3where=PY3WHERE 在Python 3.x.下搜索测试用例的目录. [NOSE_PY3WHERE]

-m=REGEX, --match=REGEX, --testmatch=REGEX  匹配Files, directories, function names, and class names获取测试用例集. 默认: (?:\b|_)[Tt]est [NOSE_TESTMATCH]

--tests=NAMES 指定测试用例. This argument is useful mainly from configuration files; on the command line, just pass the tests to run as additional arguments with no switch.

-l=DEFAULT, --debug=DEFAULT 使能调试.可用 debug loggers: nose, nose.importer, nose.inspector, nose.plugins, nose.result and nose.selector. 通过逗号设置多个.

--debug-log=FILELog 调试日志 (default: sys.stderr)

--logging-config=FILE, --log-config=FILE 加载日志配置.

-I=REGEX, --ignore-files=REGEX 忽略匹配的文件. 可多次使用 [NOSE_IGNORE_FILES]

-e=REGEX, --exclude=REGEX 排除匹配的测试用例 [NOSE_EXCLUDE]

-i=REGEX, --include=REGEX 包含匹配的测试用例(匹配files, directories, function names, and class names)来获取不匹配TESTMATCH但是匹配此处正则表达的测试用例 [NOSE_INCLUDE]

-x, --stop 第一次遇到error or failure就终止测试用例运行

-P, --no-path-adjustment 在加载测试用例时,不改变sys.path [NOSE_NOPATH]

--exe 将匹配TESTMATCH可执行文件加入测试用例集.默认不会搜可执行modules,非import-safe [NOSE_INCLUDE_EXE]

--noexe 不搜可执行权限的modules

--traverse-namespaceTraverse through all path entries of a namespace package

--first-package-wins, --first-pkg-wins, --1st-pkg-winsnose’s importer will normally evict a package from sys.modules if it sees a package with the same name in a different location. Set this option to disable that behavior.

--no-byte-compilePrevent nose from byte-compiling the source into .pyc files while nose is scanning for and running tests.

-a=ATTR, --attr=ATTR只运行带ATTR属性的测试用例 [NOSE_ATTR]

-A=EXPR, --eval-attr=EXPRRun only tests for whose attributes the Python expression EXPR evaluates to True [NOSE_EVAL_ATTR]

-s, --nocapture 不捕获输出,任何消息立马输出 [NOSE_NOCAPTURE]

--nologcapture 禁用日志捕获插件. Logging configuration将不起作用 [NOSE_NOLOGCAPTURE]

--logging-format=FORMAT 指定日志输出格式. [NOSE_LOGFORMAT]

--logging-datefmt=FORMAT 指定date/time format的输出格式. [NOSE_LOGDATEFMT]

--logging-filter=FILTER 过滤日志. 默认所有输出将被捕获. Example: filter=foo will capture statements issued ONLY to foo or foo.what.ever.sub but not foobar or other logger. Specify multiple loggers with comma: filter=foo,bar,baz. If any logger name is prefixed with a minus, eg filter=-foo, it will be excluded rather than included. Default: exclude logging messages from nose itself (-nose). [NOSE_LOGFILTER]

--logging-clear-handlers 释放其他日志处理器

--logging-level=DEFAULT 设置捕获的日志级别

--with-coverage 使能Coverage插件. [NOSE_WITH_COVERAGE]

--cover-package=PACKAGERestrict coverage output to selected packages [NOSE_COVER_PACKAGE]

--cover-eraseErase previously collected coverage statistics before run

--cover-testsInclude test modules in coverage report [NOSE_COVER_TESTS]

--cover-min-percentage=DEFAULTMinimum percentage of coverage for tests to pass [NOSE_COVER_MIN_PERCENTAGE]

--cover-inclusiveInclude all python files under working directory in coverage report. Useful for discovering holes in test coverage if not all files are imported by the test suite. [NOSE_COVER_INCLUSIVE]

--cover-htmlProduce HTML coverage information

--cover-html-dir=DIRProduce HTML coverage information in dir

--cover-branchesInclude branch coverage in coverage report [NOSE_COVER_BRANCHES]

--cover-xmlProduce XML coverage information

--cover-xml-file=FILEProduce XML coverage information in file

--cover-config-file=DEFAULTLocation of coverage config file [NOSE_COVER_CONFIG_FILE]

--cover-no-printSuppress printing of coverage information

--pdbDrop into debugger on failures or errors

--pdb-failuresDrop into debugger on failures

--pdb-errorsDrop into debugger on errors

--no-deprecatedDisable special handling of DeprecatedTest exceptions.

--with-doctestEnable plugin Doctest: Activate doctest plugin to find and run doctests in non-test modules. [NOSE_WITH_DOCTEST]

--doctest-tests 查找doctests类型测试用例(classes, methods and functions要么是doctests要么就是non-doctest. [NOSE_DOCTEST_TESTS]

--doctest-extension=EXT Also look for doctests in files with this extension [NOSE_DOCTEST_EXTENSION]

--doctest-result-variable=VARChange the variable name set to the result of the last interpreter command from the default ‘_’. Can be used to avoid conflicts with the _() function used for text translation. [NOSE_DOCTEST_RESULT_VAR]

--doctest-fixtures=SUFFIXFind fixtures for a doctest file in module with this name appended to the base name of the doctest file

--doctest-options=OPTIONSSpecify options to pass to doctest. Eg. ‘+ELLIPSIS,+NORMALIZE_WHITESPACE’

--with-isolation 使能IsolationPlugin插件: isolate changes to external modules to a single test module or package. The isolation plugin resets the contents of sys.modules after each test module or package runs to its state before the test. PLEASE NOTE that this plugin should not be used with the coverage plugin, or in any other case where module reloading may produce undesirable side-effects. [NOSE_WITH_ISOLATION]

-d, --detailed-errors, --failure-detail添加详细的错误输出 [NOSE_DETAILED_ERRORS]

--with-profile 使能分析器插件 [NOSE_WITH_PROFILE]

--profile-sort=SORT  设置分析器输出排序

--profile-stats-file=FILE 分析器状态文件(临时文件)

--profile-restrict=RESTRICT  限制分析器的输出. See help for pstats.

--no-skip 禁用跳过测试,即必须要运行测试用例.

--with-id 使能TestId: Activate to add a test id (like #1) to each test name output. Activate with –failed to rerun failing tests only. [NOSE_WITH_ID]

--id-file=FILE 存储测试ids.默认为工作目录下的 .noseids 文件.

--failed 跑上次失败的测试用例

--processes=NUMSpread test run among this many processes. Set a number equal to the number of processors or cores in your machine for best results. Pass a negative number to have the number of processes automatically set to the number of cores. Passing 0 means to disable parallel testing. Default is 0 unless NOSE_PROCESSES is set. [NOSE_PROCESSES]

--process-timeout=SECONDS 设置测试结果返回超时时间,默认 10. [NOSE_PROCESS_TIMEOUT]

--process-restartworker 测试结束重启工作进程, 用于control memory leak [NOSE_PROCESS_RESTARTWORKER]

--with-xunit 使能Xunit插件: 使用standard XUnit XML format提供测试报告. [NOSE_WITH_XUNIT]

--xunit-file=FILE 存xunit report的xml文件名. 默认工作目录下名为nosetests.xml [NOSE_XUNIT_FILE]

--xunit-testsuite-name=PACKAGEName of the testsuite in the xunit xml, generated by plugin. Default test suite name is nosetests.

--xunit-prefix-with-testsuite-name   Whether to prefix the class name under test with testsuite name. Defaults to false.

--all-modules 使能收集所有python模块的测试用例集. [NOSE_ALL_MODULES]

--collect-only  只收集并输出测试名,不执行测试用例 [COLLECT_ONLY]

nosetests示例

nosetests test.test --tc=config:./config/dbconfig.ini --tc=host:$function_test_env --tc=port:8099 -s -v --with-xunit --xunit-file=./report/report_task_model.xml --log-config=config/logging.conf --with-html --html-report=report/report_task_model.html --html-report-template=report2_only_fail.jinja2

优势

source files, directories and packages,默认在当前工作目录(及子目录下),可以通过 命令中带路径 修改查找用例的目录(如nosetests /path/to/tests /another/path/to/tests),支持正则匹配,默认(?:\b|_)[Tt]est,包、模块、类名、方法名都需要正则匹配,

任意名字的TestCase子类

注意可执行文件默认是不包含在nose的测试用例集中,需要u-x去掉可执行权限,或者添加--exe

参考链接

基于unittest一次运行多个测试方法

nose官网

nose注解

@timed(3)(超时的用法)

@eq_(a,b, msg=None)   传入两个参数,a,b,如果ab相等则执行,不等则抛出异常,并打出msg

@ok(expo,msg=None) 与@eq_相同,只是直接传入表达式True or False

@raises(*exception)如果存在异常,则标记成功(不管assert是否为true),不存在则失败

@raises(Exception)def test_1():

assert 1==2  成功,

@raises(Exception)def test_1():

assert 1==1  失败

@nottest 标记不执行该测试用例

@istest 标记为测试用例(可用于开头不为test*的方法)

失败重跑(Flaky插件)  

pip install flaky 在运行测试用例的时候带 --with-flaky: 如nosetests --with-flaky

在不稳定用例上方带注解:@flaky(max_runs=3, min_passes=2)  3次执行中需要保证2次通过

--no-flaky-report 不生成测试报告--no-success-flaky-report   过滤掉通过的用例报告

--force-flaky --max-runs=3 --min-passes=2    强制所有测试用例都使用flaky 限制3次运行2次通过

@flaky(rerun_filter=is_not_crash)   过滤掉重跑的用例

禁用flaky: no:flaky    全部都使用flaky:--with-flaky

测试报告(allure插件)

插件安装:pip install nose-allure-plugin

命令示例:nosetests -s -v test.test_func --with-allure --logdir=./report

其他支持:

(1)支持Step

step的定义如下,不一定要求函数名与step的名字一致

@nose.allure.step('make_some_data_foo')

def make_some_data_bar():

step的使用:

deftest_foo():withnose.allure.step('make_some_data_fo'):

(2)支持优先级定义

在编写用例的时候添加@nose.allure.severity("hard") 注解, 在命令运行的时候,添加:--severity="hard"

(3)支持issue、featur、story的设置

@nose.allure.feature('Feature1')

@nose.allure.story('Story1')

@nose.allure.issue('http://jira.lan/browse/ISSUE-1')

在编写用例的时候添加如上的注解,在命令行运行的时候,添加 --feature="Feature1, Feature2" --story="Story1, Story2"

存在多个设置的情况,各设置之间取或的关系来执行 --feature="Feature2" --severity="hard" 

xml及html: --with-xunit --xunit-file=./report/XXXX.xml  --with-html --html-report=report/XXXX.html --html-report-template=report2_only_fail.jinja2

基于nose-html-report定制测试报告

相关文章

网友评论

    本文标题:基于Python+Nose的测试框架

    本文链接:https://www.haomeiwen.com/subject/tuiuxhtx.html