python好用的测试库-Nose
前序:
python除了unittest,还有一款更快捷的nose,nose可以说是对unittest的一种简化吧,但是他不需要unittest那种必须有固有的格式,他只需要文件,类名,方法名等含有test就可以,unittest是需要手动来写discover函数来遍历用例的。
附github项目地址:https://github.com/nose-devs/nose
官方文档地址:http://pythontesting.net/framework/nose/nose-introduction/
不错的科普文章:http://www.cnblogs.com/liaofeifight/p/5148717.html
Name my test modules/files starting with ‘test_’.
Name my test functions starting with ‘test_’.
Name my test classes starting with ‘Test’.
Name my test methods starting with ‘test_’.
Make sure all packages with test code have an ‘init.py’ file.
安装:
python3,pip3 install nose 在线安装未成功,去下载了安装包进行离线安装:
abc@abcs-Mac:~$ pip3 install /Users/abc/Downloads/nose-1.3.7-py3-none-any.whl Processing ./Downloads/nose-1.3.7-py3-none-any.whl Installing collected packages: nose Successfully installed nose-1.3.7 abc@abcs-Mac:~$ nosetests -s
执行case:
1、命令行执行:
nosetests [文件]:
1.nosetest test.py 执行test.py这一个文件
2.nosetest *.py 正则执行要执行的py文件
nosetests [目录]:
如果不加目录,默认执行当前目录下的所有符合nose条件的用例,
如果加目录,则运行指定目录里面符合nose条件的用例
-v 把运行中的具体过程输出:nosetests -v
-s 把测试用例中的print输出打印到控制台,这个调试的时候还是挺方便的:nosetest -s
2、放到main函数中执行
import nose
nose.main(argv=['nosetests -s'])
# 执行相同目录的满足上述格式的py文件中的所有case
nose的执行规则:和unittest一样,会优先执行setUp,最后执行tesrDown,和函数的位置没关系
断言:nose里面常用的工具有很多函数,比如类似unittest的assertEqual
使用方法:
from nose import tools
然后看下里面有这么多的方法
assert_almost_equal
assert_almost_equals
assert_dict_contains_subset
assert_dict_equal
assert_equal
assert_equals
assert_false
assert_greater
assert_greater_equal
assert_in
assert_is
assert_is_instance
assert_is_none
assert_is_not
assert_is_not_none
assert_items_equal
assert_less
assert_less_equal
assert_list_equal
assert_multi_line_equal
assert_not_almost_equal
assert_not_almost_equals
assert_not_equal
assert_not_equals
assert_not_in
assert_not_is_instance
assert_not_regexp_matches
assert_raises
assert_raises_regexp
assert_regexp_matches
assert_sequence_equal
assert_set_equal
assert_true
assert_tuple_equal
eq_
istest
make_decorator
nontrivial
nontrivial_all
nottest
ok_
raises
set_trace
timed
trivial
trivial_all
with_setup
nose这样写case:
from nose import tools
class TestOne:
def __init__(self):
pass
def setup(self):
print("start!")
def teardown(self):
print("End....")
def testfunc1(self):
a = 1
b = 1
tools.ok_(a == b,"通过")
print("case1通过")
def testfunc2(self):
a = 2
b = 1
tools.ok_(a == b,"失败")
print("case2失败")
执行结果:

测试报告输出:
nose支持各种插件,其中比较好用的叫nose_htmloutput
这个插件可以直接执行case执行后的结果,并形成html,通过下面的调用方式(需要安装nose_htmloutput插件)
from nose_htmloutput import HtmlOutput nose.main(argv=['nosetests -s','--verbose', '--with-html', '--html-file
输出结果为:

这个页面可以嵌入到邮件正文,以邮件的形式发送出来;
实际应用
有同学说python的UT只有在python的工程中才能使用,但是我们做的项目并不是python写的,那这个框架有什么用呢?
回答这个问题之前先引用一句名言“人生苦短,我用python”
python写的快这个优点对测试来说尤其珍贵,我们用这个框架来做接口功能验证,能比较快的自定义我们的检查点;
来个实际应用:
一个接口http://test.sogou.com/testnose?a=100&b=hello预期的返回值是:{"result":"pass","resay":"hey"}
可以配合requests来做接口正确性的验证:
# coding=utf-8 import nose
import requests
import json def testCase1():
res = requests.get("http://test.sogou.com/testnose?a=100&b=hello")
res = res.text[1:-1]
j_res = json.loads(res)
nose.tools.ok_(j_res["result"] == "pass", "result is failed!!!")
nose.tools.ok_(j_res["resay"] == "hey", "resay is failed!!!")
用nose的理由
1、nose兼容pyunit,可以自动识别继承python unittest的测试用例
2、nose可以自动识别符合 def test***()规则的测试用例
3、执行测试更灵活,nose的命令行支持执行单个py文件内的case、支持执行指定目录的所有case
4、便于扩展,不同项目的case可以分别维护在各自的py文件中,由命令行统一执行
5、持续集成的好朋友
结尾
其实我也是刚刚接触nose,官方文档特别长,尤其是插件相关的,由此可见,nose可以自定义各种功能,接下来会继续在项目中试用其它功能,如果有同学感兴趣,或者使用过,欢迎回复交流;微信号:Lily554784810
之前在搜狗公众号看到了不错的科普文章,附上。
https://mp.weixin.qq.com/s?__biz=MjM5ODY4ODIxOA==&mid=2653201013&idx=1&sn=aae920f92f0b507d7c64f97b9c41fba4&chksm=bd16e6c08a616fd64bb756d6ee5d877205fe4c3d64a4720e4e5f4077a1e4659a40963718af66&mpshare=1&scene=23&srcid=0309iUOOSfs4sjNgEC60Ad2X%23rd
python好用的测试库-Nose的更多相关文章
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 共享变量与python测试库
共享变量(Variables) 1.变量表: 导入模式: 1.套件文件,不需要导入 2.资源文件 Resource xxx.robot 2.变量文件 导入模式: 1.Variables xx.py ...
- python 测试框架nose
python测试框架nose nose不是python自带模块,这里我才用pip的方式安装 pip install nose 这样就完成了安装,然后再确认下是否安装成功了,直接打开cmd输入noset ...
- RF之变量的共享使用与python测试库-5
RF申明变量: 首先我们要创建Variables表 *** Settings *** ${LoginUrl} http://cloud.innovpowerf.com/Account/Log ...
- python多线程在渗透测试中的应用
难易程度:★★★ 阅读点:python;web安全; 文章作者:xiaoye 文章来源:i春秋 关键字:网络渗透技术 前言 python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天, ...
- Robot Framework - 4 - 创建和扩展测试库的示例
创建和扩展Library的示例 示例:Check status on Linux OS 创建与使用library的基本步骤: 1--- library实现的内容和实现的方式 ...
- Robot Framework - 3 - 测试库API
08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...
- Robot Framework - 2 - 创建测试库
04- 创建测试库--基础概念 Robot Framework 实际的测试能力是由测试库提供的. ***** 支持的编程语言 Robot Framework 自身是用 Python 编写的,能使用 P ...
- Robot Framework - 1 - 测试用例与测试库
01- 关于测试库(Test libraries) Test libraries provide the actual testing capabilities to Robot Framework ...
随机推荐
- 笨办法学python3练习代码13-14:argv参数变量的学习
ex13.py argv参数的学习 #argv:参数变量(argument variable),这是一个标准的编程术语,在其他语言中也可可以看到.argument可译为: 参数 #如果参数是用户在执 ...
- Mybatis 的连接池技术
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...
- 吴太银:华为消费者云服务Cassandra使用场景与最佳实践
大家好,我是华为消费者云的吴太银. 我今天分享的主要是华为消费者云服务使用Cassandra的应用场景和最佳实践.我这个可能跟其他嘉宾分享的不太一样,因为前几个嘉宾讲的实际上对Cassandra原生的 ...
- 2017面向对象程序设计(Java)第五周工作总结
时光如逝,岁月如梭,不知不觉已经开学五个星期了.在代老师的带领下,我们一步一步走近Java,也渐渐的适应了翻转课堂的个性化教学,此时此刻相信同学们对Java也有了更加深入的了解.下面我对第五周的助教工 ...
- Python实现 QQ 半自动发送情话,我追到了女神
之前追女神时候用的情话发送脚本,每次工作日上班开启电脑,就会唤醒QQ,然后发送一条情话给女神,自动唤醒QQ复制情话,不用担心遗忘,现在整理分享一下,妈妈再也不用担心我找不到对象了. 效果图: 很多人学 ...
- ConHost.exe机制
- 3、Template Method 模板方法 行为型设计模式
1.了解模板方法 1.1 模式定义 定义一个操作算法中的框架,而将这些步骤延迟加载到子类中. 它的本质就是固定算法框架. 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不 ...
- MyBatisPlus配置日志,CRUD的使用
配置日志 我们所有的sql在mybatisplus是不可见的,所以在开发中需要配置日志,开发完成后,就可以取消日志了,因为日志也是损耗资源的 #配置日志 mybatis-plus: configura ...
- 2020-07-16:如何获得一个链表的倒数第n个元素?
福哥答案2020-07-16: 1.快慢指针.快指针先走n步,然后快慢指针同时走,直到快指针走到尾.2.两次遍历.第一次遍历获取链表长度,然后计算出序号,然后遍历获取序号下的元素.3.数组保存.遍历一 ...
- SpringCloudAlibaba-服务网关Gateway
一:网关简介 在微服务架构中,一个系统会被拆分为很多个微服务.那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用.这样的话会产生很多问 ...