python开发测试
哪里好自己选,只是注意广告做得多的不一定好。
-------------
Python测试开发分享感悟
今天Zoom.Quiet在公司内部分享了对Python测试开发的一些感悟,TDD以及一些开源的Python测试的库。由于一直在测试一线奋战,我被做为特邀嘉宾来到现场。由于时间关系,最后我的分享没有进行。我在这里说说对Zoom.Quiet演讲内容的一些感想吧。
下面的链接是Zoom.Quiet的幻灯片:
http://py.kingsoft.net/s5/100826-PyTDD/
我打算分享的关于Python GUI测试的幻灯片:
http://py.kingsoft.net/s5/100826-PyTDD/py-gui-automation/
1. 重点强调了TDD测试先行的做法,以及新需求到来时进行迭代的测试驱动开发过程。
感想:“测试先行”的确是TDD的核心,同时,TDD还有其他一些理念,其实也很值得分享,比如:
编写完测试案例后,用最小化或最精简的代码,让测试案例刚刚好通过( just enough)。然后再继续补充测试案例,测试案例可能失败,继而再修改代码,让新的测试案例刚刚好通过。之后一直重复这个过程,直到你再也写不出一个测试案例,需要修改你的代码。“just enough code”,我对于这点感触比较深。一方面因为,我们几乎没有可能一次性写出完全正确让所有测试案例都通过的代码,所以必定存在这个迭代的过程。另一方面,能很好的遵循YAGNI(You Are'nt Gonna Need It),避免了过度的设计。
测试案例是最好的注释,同时也是最好的文档。
2. 分享了大量Python的开源测试工具或库。
感想:知道了很多自己不知道的东西,很有意义。
3. “没有测试案例的持续集成不是持续集成”
感想:说的太好了。同时也要自我反省一下,一直想将测试案例加入持续构建,一直都没有去做~
4. “测试的本质是什么?”
感想:记得一本测试的书讲过,测试的本质,就是“想尽一切办法寻找软件的缺陷!”。我觉得也是有道理的,所谓的“保证软件的质量”,并不准确,至少,我可以举一个反例,进行高效的代码审查以及招聘最优秀的程序员,同样也能保证软件的质量,是不是软件测试呢?有人说自动化测试不能发现新的缺陷,只能保证已发现的BUG不再重现。其实,只是我们理解的是保证BUG不重现,归根结底,自动化测试案例一直重复的执行,还是为了找到软件的缺陷,并且,是存在发现新缺陷的可能的。所以,别想了,软件测试就是找BUG,直到你再也找不出来为止。(你找不出来并不意味着没有)。
5. “当你的代码需要使用过多的Mock对象进行测试时,意味着你的代码依赖过多,重构它吧”
“不可测的代码,是需要使用大量的Mock对象的代码”
“减少依赖,减少Mock对象的使用”
感想:对于这两个观点,我有一些不同意见。首先,除非你开发的是类似计算素数或是其他单一性很强的代码,你不可能不依赖到文件系统,数据库,以及网络。而一旦你的测试案例依赖于这三样东西,你的测试案例就不再属于单元测试,而是集成测试。除非你只把这部分代码交给集成测试,不然你必然需要使用Mock对象。
当然,这里所说的Mock对象也是广义的概念。严格来说,存在诸如:Spy,Fake,Stub,Mock等具有不同意义的东西。虽然只是概念上的理解,在实际测试过程中对测试案例的理解,还是很有意义的。
所以,我觉得,最不可测试的代码,因为是连Mock的机会都不给的代码。这样的代码我遇到过很多,特别是C++的代码,我见过的C++程序员,对依赖注入都没什么概念。依赖注入,是为了减少对具体对象的依赖,同时,也提供了更好的可测性。允许使用Mock对象进行模拟。
关于Mock的争论其实有很多,我也只是表达一点自己的看法。我也没有那么绝对,过度使用Mock,我也是不推荐的。
6. 有人提问:“TDD对可测性的帮助有多大?”
我的回答:很大,非常大。当你写过别人代码的测试案例的时候你就会知道,假如一个家伙从来不写测试案例,他的代码测试起来会非常痛苦。假如另一个家伙自己就会写一些测试案例测试自己的代码,在写测试代码的过程中,其实就已经是在不断的重构,使得代码更具可测性的过程。所以,这样的代码的可测性会强很多。
7. 关于我自个开发的KWinAuto自动化GUI测试框架
说明:其实这个是我们内部使用的一个GUI测试框架。为了让名字更好听,我临时修改了名字,因为灵感和一些东西来自开源的PyWinAuto,所以,我索性取了个名,叫KWinAuto。这个框架主要是非常简单的处理了常见的Windows控件的操作,并且是为我们自己实际测试量身打造的这么一个库。离最终开源出来让大家分享还是有一些距离,所以,就先不放出来了,大家就从我的幻灯片里先了解一下吧。
B. python用什么方法测试
Python简单易学、免费开源、高层语言、可移植性超强、可扩展性、面向对象、可版嵌入型、丰富的库、规范的代码权等。Python除了极少的涉及不到的开发之外,其他基本上可以说全能:系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、爬虫编写、机器学习、人工智能等等。Python的应用特别广,中国现在的人才缺口超过100万。
如果你想要专业的学习Python开发,更多需要的是付出时间和精力,一般在2w左右。应该根据自己的实际需求去实地看一下,先好好试听之后,再选择适合自己的。只要努力学到真东西,前途自然不会差。
C. 测试转python开发难不难
Python简单易学、免费开源、高层语言、可移植性超强、可扩展性、面向对象、可嵌入型、回丰富的库、规范的代答码等。Python除了极少的涉及不到的开发之外,其他基本上可以说全能:系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、爬虫编写、机器学习、人工智能等等。Python的应用特别广,中国现在的人才缺口超过100万。
如果你想要专业的学习Python开发,更多需要的是付出时间和精力,一般在2w左右。应该根据自己的实际需求去实地看一下,先好好试听之后,再选择适合自己的。只要努力学到真东西,前途自然不会差。
D. 如何使用python编写测试脚本
1)doctest
使用doctest是一种类似于命令行尝试的方式,用法很简单,如下
复制代码代码如下:
def f(n):
"""
>>> f(1)
1
>>> f(2)
2
"""
print(n)
if __name__ == '__main__':
import doctest
doctest.testmod()
应该来说是足够简单了,另外还有一种方式doctest.testfile(filename),就是把命令行的方式放在文件里进行测试。
2)unittest
unittest历史悠久,最早可以追溯到上世纪七八十年代了,C++,java里也都有类似的实现,Python里的实现很简单。
unittest在python里主要的实现方式是TestCase,TestSuite。用法还是例子起步。
复制代码代码如下:
from widget import Widget
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget.dispose()
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
def testResize(self):
self.widget.resize(100, 100)
self.assertEqual(self.widget.getSize(), (100, 100))
# 测试
if __name__ == "__main__":
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
简单的说,1>构造TestCase(测试用例),其中的setup和teardown负责预处理和善后工作。2>构造测试集,添加用例3>执行测试需要说明的是测试方法,在Python中有N多测试函数,主要的有:
TestCase.assert_(expr[, msg])
TestCase.failUnless(expr[, msg])
TestCase.assertTrue(expr[, msg])
TestCase.assertEqual(first, second[, msg])
TestCase.failUnlessEqual(first, second[, msg])
TestCase.assertNotEqual(first, second[, msg])
TestCase.failIfEqual(first, second[, msg])
TestCase.assertAlmostEqual(first, second[, places[, msg]])
TestCase.failUnlessAlmostEqual(first, second[, places[, msg]])
TestCase.assertNotAlmostEqual(first, second[, places[, msg]])
TestCase.failIfAlmostEqual(first, second[, places[, msg]])
TestCase.assertRaises(exception, callable, ...)
TestCase.failUnlessRaises(exception, callable, ...)
TestCase.failIf(expr[, msg])
TestCase.assertFalse(expr[, msg])
TestCase.fail([msg])
E. python写的测试框架怎么使用
安装
>pipinstall-Upytest#通过pip安装
>py.test--version#查看pytest版本
Thisispytestversion2.7.2,importedfromC:Python27libsite-packagespytest.pyc
简单的测试
让我们创建第一个文件,对个简单的功能进行测试。
好吧!其实, 我也不理解这段代码的含义,但是执行它的可运行测试用例了。
pytest/
├──test_case/
│├── test_sample.py
│├──test_class.py
│├── __init__.py
│ └──test_case2/
│ ├── test_main.py
│ ├── test_time.py
│ └──__init__.py
└──runtests.py
执行runtest.py文件。
>python runtest.py
当然,你也可以打开runtests.py 文件运行它。
===================================================================
*最后,pytest是如果识别测试用例的呢?它默认使用检查以test_ *.py 或*_test.py命名的文件名,在文件内部查找以test_打头的方法或函数,并执行它们。
pytest还有许多需要讨论的地方,做为这个系列的第一节,先介绍到这里。
F. 如何使用python 语言来实现测试开发
对于各种驱动接口,Python来编写测试用例的好处是:由于Python不需要编译,你所执行的也就是你所编写的,当发生异常的时候,你无须打开集成开发环境,加载测试工程、并调试,你能够很方便的看到python测试脚本的内容,什么地方出了异常可以立刻发现,例如:
from ctypes import *
rc =c_int(-12345);
dll = windll.LoadLibrary("dmodbc.dll");#加载被测试组件
#=================#
SQLHANDLE_env = pointer(c_long(0));
SQLHANDLE_cnn = pointer(c_long(0));
SQLHANDLE_stmt = pointer(c_long(0));
pdns = c_char_p("FASTDB");
puid = c_char_p("SYSDBA");
ppwd = c_char_p("SYSDBA");
#env handle
rc = dll.SQLAllocHandle(1,None,byref(SQLHANDLE_env));
print "result of henv handle alloc :%d" %rc;
#cnn handle
rc = dll.SQLAllocHandle(2,SQLHANDLE_env,byref(SQLHANDLE_cnn));
print "result of cnn handle alloc :%d" %rc;
#connect!
rc = dll.SQLConnect(SQLHANDLE_cnn,pdns,-3,puid,-3,ppwd,-3)
print "result of connect :%d" %rc;
#stmt handle
rc = dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt));
print "result of stmt handle alloc:%d" %rc;
#exec
rc = dll.SQLExecDirect(SQLHANDLE_stmt,"insert into t values(1)",-3);
print "result of exec:%d" %rc;
#free========================
rc = dll.SQLFreeHandle(3, SQLHANDLE_stmt);
print rc;
rc = dll.SQLDisconnect(SQLHANDLE_cnn);
print rc;
rc = dll.SQLFreeHandle(2, SQLHANDLE_cnn);
print rc;
rc = dll.SQLFreeHandle(1, SQLHANDLE_env);
print rc;
在上面我们可以看到,Python调用c/c++接口是十分容易的,只需要把动态库加载进来,然后把这个动态库当作一个对象实例来使用就可以了。下面将是一个使用ado.net接口的例子:
import System;
from Dm import *#Dm是DMDBMS提供的ado.Net的DataProvider
#print dir(Dm.DmCommand);
i =0;
cnn = Dm.DmConnection("server = 127.0.0.1; User ID = SYSDBA; PWD = SYSDBA; Database = SYSTEM; port = 12345");
cmd = Dm.DmCommand();
cmd.Connection = cnn;
cmd.CommandText = "insert into t values(1);";
cnn.Open();
i=cmd.ExecuteNonQuery();
print i;
cmd.Dispose();
cnn.Close();
可以看到,.net对象的使用与在VisualStdio上进行开发几乎没有任何区别。
通过使用Python进行测试用例的开发,最大的好处莫过于:学习成本非常低,测试工程师只需要学习Python,对于其他语言稍有了解就可以了。同时只需要少量的测试开发工程师对Python测试框架进行维护。
这样的好处就是便于测试人员将精力专精在一个方向,免于“什么都会一点,但什么都不精”的情况。当然测试人员具备广阔的知识面,会使用各种常见的开发工具与平台是好事情,并且也是必要的,不过在短时间内要求迅速能够胜任大多数任务也是企业在人才培养上的期望目标。
G. 用python可以做什么测试
1.将日常工作最常用的一些命令或者工具脚本化,比如用Python脚本完成更新代码,打包功内能
2.使用Python创建一个声称测试容数据的脚本,开发每次都要找你帮忙创建一堆测试数据,你能忍受每次都要鼠标点击那么多次来填写n多表单么,为啥不搞个脚本
3.做一些自动化测试的工作
4.用Python创建一些简单网站,把开发,测试,产品经常烦扰你的工作都放到网页上,让他们自己傻瓜操作多好。
5.用来维护测试服务器
6.CI(持续集成)往往也需要一个脚本来配合工作
7.创建一些监控程序,监控测试环境和线上的接口
H. python和java哪个比较适合做自动化测试,和测试开发一般用哪种语言。
用python,类库多,方便,简单,容易上手,自动化平台测试开发-Python测试开发实战 推荐看一下这本书
I. Python和软件测试哪个简单初学者可以学好吗
python是一种编程语言,适合逻辑思维好的人学
软件测试相对比较简单,但是现在基本都是自动化,是要求会一点python或java语言的
初学者建议学测试能好一点,刚开始从手工测试开始,再学自动化测试,一步一步来
J. Python的wep开发和软件测试哪个难
你这个来态度可不好,不要哪个简单源就学哪个简单就代表着技术含量低技术含量低就代表着容易学成容易学成就代表着技术不值钱容易被替代?也就是工作待遇也不好,也容易失业。
不要认为女生就一定要学习,容易的,其实在it技术行当里面,你说的这些技术男生女生都一样,只不过女生很少有喜欢学习编程的,但不代表就不能学不适合学。