Python自动单元测试框架学习
软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类“没有创新”的工作。既然如此,为什么不让程序员在编写软件时自己加入一些用于测试的代码,使测试过程自动化呢?在软件工程中,这一技术称为自动单元测试,本文介绍在用Python开发软件时如何实现这一目标。
一、软件测试
大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施。正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的“很好的状态”得加个问号)。测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题。
可惜的是,软件开发人员很少能在编码的过程中就进行软件测试,大部分软件项目都只在最终验收时才进行测试,有些项目甚至根本没有测试计划!随着软件质量意识的增强,许多软件开发组织开始转向UML、CMM、RUP、XP等软件工程方法,以期提高软件质量,并使软件开发过程更加可控,好在这些方法对测试都提出了很严格的要求,从而使得测试在软件开发过程的作用开始真正体现出来。
软件测试作为一种系统工程,涉及到整个软件开发过程的各个方面,需要管理人员、设计人员、开发人员和测试人员的共同努力。作为软件开发过程中的主要力量,现今的程序员除了要编写实现代码外,还承担着单元测试这一艰巨任务,因此必须采用新的工作模式:
?编写和维护一套详尽的单元测试用例;
?先构造单元测试和验收测试用例,然后再编写代码;
?根据构造的测试用例来编写代码。
单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。由于软件模块并不是一个单独的程序,为了进行单元测试还必须编写大量额外的代码,从而无形中增加了开发人员的工作量,目前解决这一问题比较好的方法是使用测试框架。测试框架是在用XP方法进行单元测试时的关键,尤其是在需要构造大量测试用例时更是如此,因为如果完全依靠手工的方式来构造和执行这些测试,肯定会变成一个花费大量时间并且单调无味的工作,而测试框架则可以很好地解决这些问题。
使用Python语言的开发人员可以使用Steve Purcell编写的PyUnit作为单元测试框架,通过将单元测试融合到PyUnit这一测试框架里,Python程序员可以更容易地增加、管理、执行测试用例,并对测试结果进行分析。此外,使用PyUnit还可以实现自动单元测试(回归测试)。
二、规范Python单元测试
测试是一个贯穿于整个开发过程的连续过程,从某个意义上说,软件开发的过程实际上就是测试过程。正如Martin Fowler所说的“在你不知道如何测试代码之前,就不该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序。”
测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败。为了更好地理解PyUnit这一自动测试框架的作用,先来看一个简单的例子,假设我们要对例1中的Widget类进行测试:
例1. widget.py
采用手工方式进行单元测试的Python程序员很可能会写出类似例2的测试代码来,
例2. manual.py
稍一留心你不难发现这种手工测试方法存在许多问题。首先,测试程序的写法没有一定的规范可以遵循,十个程序员完全可能写出十种不同的测试程序来,如果每个Python程序员都有自己不同的设计测试类的方法,光维护被测试的类就够麻烦了,谁还顾得上维护测试类。其次,需要编写大量的辅助代码才能进行单元测试,例1中用于测试的代码甚至比被测试的代码还要多,而这毫无疑问将增大Python程序员的工作量。
为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是让开发人员遵循一定的规范来编写用于测试的代码,具体到Python程序员来讲,则是要采用PyUnit这一自动测试框架来构造单元测试用例。目前PyUnit
已经得到了大多数Python开发人员的认可,成了事实上的单元测试标准。如果采用PyUnit来进行同样的测试,则测试代码将如例3所示:
例3. auto.py
在采用PyUnit这一单元测试框架后,用于测试的代码做了相应的改动:
用import语句引入unittest模块。
让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
在testSize()中调用assertEqual()方法,对Widget类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是TestCase 类中定义的方法。
提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite看成是包含所有测试用例的一个容器。
虽然看起来有点复杂,但PyUnit使得所有的Python程序员都可以使用同样的单元测试方法,测试过程不再是杂乱无章的了,而是在同一规范指导下进行的有序行为,这就是使用PyUnit这一自动单元测试框架所带来的最大好处。
三、自动测试框架PyUnit
在对软件测试理论和PyUnit有了一个大致了解之后,下面辅以具体的实例介绍Python程序员如何借助PyUnit来进行单元测试。所有的代码均在Python 2.2.2下调试通过,操作系统使用的是Red Hat Linux 9。
3.1 安装
在Python中进行单元测试时需要用到PyUnit模块,Python 2.1及其以后的版本都将PyUnit作为一个标准模块,但如果你使用的是较老版本的Python,那就要自已动手安装了。在PyUnit的网站
(https://www.sodocs.net/doc/b41667132.html,/projects/pyunit)上可以下载到PyUnit最新的源码包,此处使用的是pyunit-1.4.1.tar.gz。
在下载好PyUnit软件包后,执行下面的命令对其进行解压缩:
[root@gary source]# tar xzvf pyunit-1.4.1.tar.gz
要在Python程序中使用PyUnit模块,最简单的办法是确保PyUni软件包中的文件unittest.py和unittestgui.py都包含在Python的搜索路径中,这既可以通过直接设置PYTHONPATH环境变量来实现,也可以执行以下的命令来将它们复制到Python的当前搜索路径中:
[root@gary source]# cd pyunit-1.4.1
[root@gary pyunit-1.4.1]# python setup.py install
3.2 测试用例TestCase
软件测试中最基本的组成单元是测试用例(test case),PyUnit使用TestCase类来表示测试用例,并要求所有用于执行测试的类都必须从该类继承。TestCase子类实现的测试代码应该是自包含(self contained)的,也就是说测试用例既可以单独运行,也可以和其它测试用例构成集合共同运行。
TestCase在PyUnit测试框架中被视为测试单元的运行实体,Python程序员可以通过它派生自定义的测试过程与方法(测试单元),利用Command和Composite设计模式,多个TestCase还可以组合成测试用例集合。PyUnit测试框架在运行一个测试用例时,TestCase子类定义的setUp()、runTest()和tearDown()方法被依次执行,最简单的测试用例只需覆盖runTest()方法来执行特定的测试代码就可以了,如例4所示:
例4. static_single.py
而要在PyUnit测试框架中构造上述WidgetTestCase类的一个实例,应该不带任何参数调用其构造函数:
testCase = WidgetTestCase()
一个测试用例通常只对软件模块中的一个方法进行测试,采用覆盖runTest()方法来构造测试用例在PyUnit中称为静态方法,如果要对同一个软件模块中的多个方法进行测试,通常需要构造多个执行测试的类,如例5所示:
例5. static_multi.py
采用静态方法,Python程序员不得不为每个要测试的方法编写一个测试类(该类通过覆盖runTest()方法来执行测试),并在每一个测试类中生成一个待测试的对象。在为同一个软件模块编写测试用例时,很多时候待测对象有着相同的初始状态,因此采用上述方法的Python程序员不得不在每个测试类中为待测对象进行同样的初始化工作,而这往往是一项费时且枯燥的工作。
一种更好的解决办法是采用PyUnit提供的动态方法,只编写一个测试类来完成对整个软件模块的测试,这样对象的初始化工作可以在setUp()方法中完成,而资源的释放则可以在tearDown()方法中完成,如例6所示:
例6. dynamic.py
采用动态方法最大的好处是测试类的结构非常好,用于测试一个软件模块的所有代码都可以在同一个类中实现。动态方法不再覆盖runTest()方法,而是为测试类编写多个测试方法(按习惯这些方法通常以test开头),在创建TestCase 子类的实例时必须给出测试方法的名称,来为PyUnit测试框架指明运行该测试用例时究竟应该调用测试类中的哪个方法:
sizeTestCase = WidgetTestCase("testSize")
resizeTestCase = WidgetTestCase("testResize")
3.3 测试用例集TestSuite
完整的单元测试很少只执行一个测试用例,开发人员通常都需要编写多个测试用例才能对某一软件功能进行比较完整的测试,这些相关的测试用例称为一个测试用例集,在PyUnit中是用TestSuite类来表示的。
在创建了一些TestCase子类的实例作为测试用例之后,下一步要做的工作就是用TestSuit类来组织它们。PyUnit测试框架允许Python程序员在单元测试代码中定义一个名为suite()的全局函数,并将其作为整个单元测试的入口,PyUnit通过调用它来完成整个测试过程。
也可以直接定义一个TestSuite的子类,并在其初始化方法(__init__)中完成所有测试用例的添加:
这样只需要在suite()方法中返回该类的一个实例就可以了:
def suite():
return WidgetTestSuite()
如果用于测试的类中所有的测试方法都以test开,Python程序员甚至可以用PyUnit模块提供的makeSuite()方法来构造一个TestSuite:
def suite():
return unittest.makeSuite(WidgetTestCase, "test")
在PyUnit测试框架中,TestSuite类可以看成是TestCase类的一个容器,用来对多个测试用例进行组织,这样多个测试用例可以自动在一次测试中全部完成。事实上,TestSuite除了可以包含TestCase外,也可以包含TestSuite,从而可以构成一个更加庞大的测试用例集:
3.4
编写测试用例(TestCase)并将它们组织成测试用例集(TestSuite)的最终目的只有一个:实施测试并获得最终结果。PyUnit使用TestRunner类作为测试用例的基本执行环境,来驱动整个单元测试过程。Python开发人员在进行单元测试时一般不直接使用TestRunner类,而是使用其子类TextTestRunner来完成测试,并将测试结果以文本方式显示出来:
runner = unittest.TextTestRunner()
runner.run(suite)
使用TestRunner来实施测试的例子如例7所示,
例7. text_runner.py
要执行该单元测试,可以使用如下命令:
[xiaowp@gary code]$ python text_runner.py
运行结果应该如下所示,表明执行了2个测试用例,并且两者都通过了测试:
默认情况下,TextTestRunner将结果输出到sys.stderr上,但如果在创建TextTestRunner类实例时将一个文件对象传递给了构造函数,则输出结果将被重定向到该文件中。在Python的交互环境中驱动单元测试时,使用TextTestRunner类是一个不错的选择。
PyUnit模块中定义了一个名为main的全局方法,使用它可以很方便地将一个单元测试模块变成可以直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中的测试方法,并自动执行它们。如果Python程序员能够按照约定(以test开头)来命名所有的测试方法,那就只需要在测试模块的最后加入如下几行代码即可:
if __name__ == "__main__":
unittest.main()
使用main()方法来实施测试的例子如例8所示,
例8. main_runner.py
要执行该单元测试,可以使用如下命令:
[xiaowp@gary code]$ python main_runner.py
测试类WidgetTestCase中的所有测试方法都将被自动执行,但如果只想执行testSize()方法,可以使用如下命令:
[xiaowp@gary code]$ python main_runner.py WidgetTestCase.testSize
如果在单元测试脚本中定义了TestSuite,还可以指定要运行的测试集。使用-h参数可以查看运行该脚本所有可能用到的参数:
[xiaowp@gary code]$ python main_runner.py -h
为了使单元测试更具亲合力,PyUnit软件包中还提供了一个图形界面测试脚本unittestgui.py,将其复制到当前目录后,可以执行下面的命令来启动该测试工具,对main_runner.py脚本中的所有测试用例进行测试:
[xiaowp@gary code]$ python unittestgui.py main_runner
该测试工具动行时的界面如图1所示:
图1. 图形测试工具
单击Start按钮可以开始执行所有测试用例,测试结果将如图2所示:
图2 测试结果
使用图形界面可以更好地进行单元测试,查询测试结果也更加方便。PyUnit 对于没有通过的测试会进行区分,指明它是失败(failure)还是错误(error),失败是被assert类方法(如assertEqual)检查到的预期结果,而错误则是由意外情况所引起的。
四、小结
测试是保证软件质量的关键,新的软件开发方法要求程序员在编写代码前先编写测试用例,并在软件开发过程中不断地进行单元测试,从而最大限度地减少缺陷(Bug)的产生。软件单元测试是XP方法的基石,测试框架为程序员进行单元测试提供了统一的规范,Python程序员可以使用PyUnit作为软件开发过程中的自动单元测试框架。
. python webdriver 项目实战 文档Word . 第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 fro selenium impor webdriver impor time driver = webdriver.Firefox() driver.get睜睷?硸) driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡) driver.find_element_by_id瑜偢獡睳牯).send_keys???) driver.find_element_by_id扜湴潌楧).click() 执行具体用例操 ...... driver.quit ()脚本二 from selenium import webdriver import time driver = webdriver.Firefox() driver.get(睜睷?硸?) driver.find_element_by_id(瑜啢敳乲浡履).send_keys(甥敳湲浡履)
driver.find_element_by_id(瑜偢獡睳牯層).send_keys(???尶) driver.find_element_by_id(扜湴潌楧屮).click() #执行具体用例操作 文档Word . ...... driver.quit ()通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是就有了下面的改进。login.py 登录模de login(): driver.find_element_by_id瑜啢敳乲浡).send_keys甥敳湲浡) driver.find_element_by_id瑜偢獡睳牯).send_keys??㈱) driver.find_element_by_id扜湴潌楧).click() 测试用例:#coding=utf-fro selenium impor webdriver 文档Word . 注意,上面代码并非完整代码,不能运行。
第一周 1.下列关于函数的描述中,正确的说法有哪些? ·函数可以是自己定义的,也可以是Python内置的·一个函数可以被重复调用多次 ·函数可以不带参数,也可以带多个参数·函数可以有返回值,也可以没有返回值 2.一个if语句下可以有多少个elif分支? ·可以是0个,也可以是多个。 3.当p为True,q为False时,布尔表达式not ( p and not q )的结果是什么?【pycharm 上运行】 请在下面的输入框里填写答案True或False。【写print()里运行】·False 4.给定一个正整数x,希望用一个表达式直接求出它的十位数。例如:当x等于923时,得到的结果是2;当x等于1234时,得到的结果是3。下列哪些表达式可以计算出正确的结果?【写print()里运行】 (请在PyCharm中验证下列每个表达式的结果之后再作答) x / 10 ·(x // 10) % 10 (x - x % 10) / 10 ·int(((x - x % 10) % 100) / 10) * 比如: x1=923 x2=1234 print(x1 / 10) 5.函数random.randint(0, 10) 和random.randrange(0, 10)产生的随机数范围不同。值得注意的是,【pycharm 上运行】在大多数Python编程中更习惯使用random.randrange(),因为该函数产生的数值更符合Python的范围习惯。 哪个数字是这两个函数其中一个可以产生的,而另一个函数无法产生的?请把这个数输入到下面的输入框中。·10* 因为:randint a<=x<=b 等于10 randrange a<=x接口自动化测试框架实例详解教程python+requests
接口自动化测试框架实例详解教程python+requests 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,这套自动化框架目前已经基本完成了,于是进行一些总结,便于以后回顾温习,有许多不完善的地方,也遇到了许多的问题,希望大神们多多指教。下面我就进行今天的主要内容吧。 1、首先,我们先来理一下思路。 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具—> 配置需要的接口参数—> 进行测试—> 检查测试结果(有的需要数据库辅助)—> 生成测试报告(html报告) 那么,我们就根据这样的过程来一步步搭建我们的框架。在这个过程中,我们需要做到业务和数据的分离,这样才能灵活,达到我们写框架的目的。只要好好做,一定可以成功。这也是我当初对自己说的。 接下来,我们来进行结构的划分。 我的结构是这样的,大家可以参考下: common:存放一些共通的方法 result:执行过程中生成的文件夹,里面存放每次测试的结果 testCase:用于存放具体的测试case testFile:存放测试过程中用到的文件,包括上传的文件,测试用例以及数据库的sql 语句 caselist:txt文件,配置每次执行的case名称 config:配置一些常量,例如数据库的相关信息,接口的相关信息等 readConfig:用于读取config配置文件中的内容 runAll:用于执行case
第三周 A...... 1.编写Python程序绘制箭靶的图形,应该按照什么顺序画这些圆?·由大到小 2.下面哪些选项是正确的?【pycharm 上运行】 int("5.4") ·int('5') ·float("5.4") int('5.4') float("5 five") ·int("5") ·float("5") 3.defdate(year, month): 【pycharm 上运行】 """ 给定year和month两个参数, 返回一个字符串,形式为year-month。 例如当year为2015,month为10的时候,返回字符串"2015-10", """ return ??? print(date(2015,10)) ·str(year) + "-" + str(month) 4.仔细阅读下面的描述信息,将其转换为Python程序。【pycharm 上运行】 创建一个300*300像素的画布,画两个圆,线宽均为10像素,颜色为白色,半径为20像素。其中一个圆的坐标为 (90,200),另一个圆的坐标为(210,200)。再画一条红色的直线,线宽为40像素,起始坐标和终止坐标分别为 (50,180)和(250,180)。然后画两条线宽为5像素,颜色为红色的直线,第一条起始和终止坐标分别为(55,170)和(90,120),第二条线起始和终止坐标分别为(90,120)和(130,120)。最后再画一条线宽为140像素,颜色为红色的直线, 起始坐标为(180,108),终止坐标为(180,160)。 运行你的代码,产生的图像是什么?·汽车 5.在SimpleGUITk中,绘制图形的事件处理函数的参数是什么?·画布对象(通常起名为canvas) 6.请问draw_circle,draw_image,draw_text,draw_line等函数应该在程序的哪一部分被调用? ·在可以访问到画布对象(canvas)的函数中 7.当你用draw_text()在画布上绘制文字的时候,如果你设置的文本显示位置超出了画布的坐标,会发生什么事情? (你可以在PyCharm中进行测试后再作答!)·部分或没有文本显示出来,文本显示的位置只有在画布内才会显示出来。 8.Python中哪个操作符可以将两个字符串连接成一个字符串,例如“我正在”和“学习python”连接后成为"我正在学习python"。(建议在idle或PyCharm中对每一个选项进行测试后再作答!)·+ 9.假设画布宽为400像素,高为300像素。要求画出画布的对角线,线的颜色为黄色,线宽为10像素。下面哪几条语句能够完成? canvas.draw_line((400, 400), (300, 300), 10, "yellow") ·canvas.draw_line((400, 0), (0, 300), 10, "yellow") canvas.draw_line((300, 0), (0, 400), 10, "yellow") ·canvas.draw_line((0, 0), (400, 300), 10, "yellow") canvas.draw_line((300, 300), (400, 400), 10, "yellow") 10.计算下列字符串的长度?【pycharm 上运行】 1111l1111l1111l1111l111111*********l11l1l111ll1ll11l111l111l111l111111111l1111l111l111l111l111l1111111 请使用内置函数len统计该字符串的长度,将结果填入下列文本框中。·102 第三周第一页 B....
Python测试题 一、填空题 1.Python使用符号#标示注释;以缩进对齐划分语句块。 2、Python序列类型包括字符串、列表、元组三种; 字典是Python中唯一的映射类型。 3、Python中的可变数据类型有列表和字典,不可变数据类 型有字符串、数字、元组。 4、Python的数字类型分为整数、长整数、浮点、 复数等子类型。 5、Python提供了两个对象身份比较操作符is和is not来测试两个变量是否指向同一个对象,也可以通过内建函数type()来测试对象的类型。 6、设s=‘abcdefg’,则s[3]值是‘d’,s[3:5]值是‘de’, s[:5]值是‘abcdf’,s[3:]值是‘defg’,s[::2]值是‘aceg’,s[::-1]值是‘gfedcba’,s[-2:-5]值是‘’。 二、选择题 1.下列哪个语句在Python中是非法的?() A、x=y=z=1 B、x=(y=z+1) C、x,y=y,x D、x+=y 2.关于Python内存管理,下列说法错误的是()
A、变量不必事先声明 B、变量无须先创建和赋值而直接使用 C、变量无须指定类型 D、可以使用del释放资源 3、下面哪个不是Python合法的标识符() A、int32 B、40XL C、self D、__name__ 4、下列哪种说法是错误的() A、除字典类型外,所有标准对象均可以用于布尔测试 B、空字符串的布尔值是False C、空列表对象的布尔值是False D、值为0的任何数字对象的布尔值是False 5、下列表达式的值为True的是() A、5+4j>2-3j B、3>2>2 C、(3,2)<(‘a’,’b’) D、’abc’>‘xyz’ 6、Python不支持的数据类型有() A、char B、int C、float D、list 7、关于Python中的复数,下列说法错误的是() A、表示复数的语法是real+image j B、实部和虚部都是浮点数 C、虚部必须后缀j,且必须是小写 D、方法conjugate返回复数的共轭复数 8、关于字符串下列说法错误的是() A、字符应该视为长度为1的字符串 B、字符串以\0标志字符串的结束
Python题(共100分) 一.(共18题,1题5分,共90分) 1. 以下是Python比较运算符中的等于的是( ) A. >= B. <= C. == D. = 2. Python中“假”用什么表示?( ) A. True B. false C. False D. true 3. 以下结果为True的是?( ) A. 3 >= 5 B. 4 == 4 C. 5 < 3 D. 5 != 5 4. 我们使用哪个关键字给模块起一个小名呢?( ) A. as B. import C. Python D. sa 5. 以下程序结果为False的是?( ) A. True and True B. True or False C. False and True D. True or True 6. age = 20 beauty = 95 下列程序结果为True的是?( ) A. age >= 18 and beauty >=80 B. age <= 18 and beauty >=80 C. age >= 18 and beauty <=80 D. age <= 18 and beauty <=80 7. score = 55 if score >= 90 : print(‘3个红花’) elif score >= 80 : print(‘2个红花’) elif score >= 60 : print(‘1个红花’) else : print(‘继续努力’) 成绩等级输出的结果是( ) A. 3个红花 B. 2个红花 C. 1个红花 D. 继续努力 8. 以下程序输出的结果是( ) print(‘1’ + ‘1’) A. ‘11’ B. ‘2’ C. ?一 D. 555 9. 以下程序输出的结果是( ) print(1 + ‘1’) A. ‘11’ B. 程序报错 C. 2 D. ‘2’ 10. str() 将值转化成整数 int() 将值转化成字符串 11. year = ‘2017’ 以上程序结果为'20171'的是? ( ) A. print(year + 1) B. print(str(year) + 1) C. print(int(year) + 1) D. print(year + str(1)) 12. if 条件: print(‘我是编程小达人’) 根据上述代码分析:当以下哪个 选项作为条件时, 会在猿编程IDE提示窗口输出 “我是编程小达人”( ) A. 3 <= 5 B. 4 != 4 C. 5 < 3 D. 6 == 5 13. 有代码如下: if 56 == 100: 语句1 语句2 请问执行哪些语句( ) A. 执行语句1和语句2 B. 只执行 语句1 C. 什么都不执行 D. 只执行语句 2 14. print(‘666’ == ‘666’) 执行上面代码,输出的结果是? ( ) A. True B. False C. ‘666’== ‘666’ D. 不知 道 15. 以下程序结果为True的是?( ) A. True and False B. True and True C. False and True D. False and False 16. 以下程序结果为False的是? ( ) A. True or False B. True or True C. False or True D. False or False 17. “年龄小于等于12或者性别为女” 表达正确的是?( ) A. age < 12 or gender == ‘女’ B. age <= 12 or gender = ‘女’ C. age <= 12 or gender == ‘女’ D. age < 12 or gender = ‘女’ 18. age = 25 if age >= 18: print(‘晨晨是成年人’) print(‘晨晨很胖’) 运行程序后交互窗口的显示结 果为( ) 年龄:25 A、晨晨是成年人 晨晨很胖 C、晨晨是宝宝 B、晨晨很胖 D、晨晨是成年人 二.(10分) 1. 电脑中我们向文件内写入内容的 步骤是?( ) A. 写入文件——> 打开文件— —> 关闭文件 B. 打开文件——> 写入文件— —> 关闭文件 C. 打开文件——> 关闭文件— —> 写入文件 D. 关闭文件——> 写入文件— —> 打开文件
第二周 A...... 1.用simpleguitk创建的应用程序框架是由哪三部分组成的? 标题 ·控制区域 鼠标 边框 ·画布 键盘 ·状态区域 背景区域 选择区域 2.假设在程序中已经导入simpleguitk,下列哪项对create_frame()函数的调用是正确的?(如果不肯定你的答案,先在PyCharm中测试,然后再作答) ·frame = simpleguitk.create_frame(100, 100, 100, 100) ·frame = simpleguitk.create_frame("测试", 200, 200, 300) ·frame = simpleguitk.create_frame("我的框架", 200, 200) ·frame = simpleguitk.create_frame(150, 150, 150) * import simpleguitk frame=simpleguitk.create_frame() frame.start() 3.用simpleguitk创建交互式应用程序时,通常包含以下7个步骤: 1、定义辅助函数 2、创建框架 3、定义事件处理函数 4、启动框架和定时器 5、初始化全局变量 6、注册事件处理函数 7、定义类 创建程序时最后一步应该是哪一步?注意:上面的7个步骤顺序已被打乱 请选择最后一步对应的数字序号: ·4 4.m = 4 n = 2 def f(m): x = m + n return x 以上程序中,哪些变量的作用范围是全局的? ·m f x ·n
n = 2 def f(m): x = m + n return x 以上程序中,哪些变量的作用范围仅在函数内部? ·m f ·x n 6.用simpleguitk模块开发游戏程序,程序中的事件处理函数是如何产生的? ·你自己通过编写代码来定义事件处理函数 7.假设在程序里声明了一个全局变量x = 8,该程序还要定义一些函数, 以下哪些函数里面需要添加global x 声明?【可以在pycharm 上运行看看】 (如果你没有把握,请在PyCharm对每个选项进行测试后再作答。) def b(x, y): x = x + y return x ·def a(y): x = x + y return y def d(y): y = x + y return y def c(y): return x + y 8.??? frame = simpleguitk.create_frame("我的框架", 200, 200) frame.start() 如果上述程序执行时能够正常生成一个窗口框架(不抛出错误),那么???处可以用 下列哪一条语句替换? ·import simpleguitk 9. count=0 【pycharm 上运行】 def square(x): global count count += 1 return x**2 print (square(square(square(square(5))))) 以上程序执行后,变量count的数值是多少?你可以在PyCharm中进行测试,请将你认为的正确值填入到下面的输入框中。·4
PYTHON测试题
A.defines a list and initializes it B.defines a function, which does nothing C.defines a function, which passes its parameters through D.defines an empty class A.
A.
一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。 ? Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并把录制的操作以多种语言(例如java、python等)的形式导出成测试用例。 ? ? Selenium WebDriver:提供Web自动化所需的API,主要用作浏览器控制、页面元素选择和调试。不同的浏览器需要不同的WebDriver。 ? ? Selenium Grid:提供了在不同机器的不同浏览器上运行selenium测试的能力。 ? 本文将详细介绍如何运用Python结合Selenium WebDriver库搭建web自动化测试框架。 二、自动化测试框架 一个典型的自动化测试框架一般包括用例管理模块、自动化执行控制器、报表生成模块和log模块,这些模块相辅相成。
接下来介绍各模块的逻辑单元: 1、用例管理模块 用例管理模块包括新增、修改、删除等操作单元,这些单元又会涉及到用例书写模式,测试数据库的管理、可复用库等。 2、自动化控制器 控制器是自动化用例执行的组织模块,主要是负责以什么方法执行我们的测试用例. 3、报表生成模块 主要负责执行用例后的生成报告,一般以HTML格式居多,信息主要是用例执行情况。另外还可以配置发送邮件功能。 4、log模块 主要用来记录用例执行情况,以便于高效的调查用例失败信息以及追踪用例执行情况。 三、自动化框架的设计和实现 1、需求分析
如何用 Python实现自动化测试 近期一直在看王阳明的相关书籍,他的一个观点我非常赞同,不管要学习什么一定要立志,立志是非常非常重要的,但是立志前一定要有动机,或者说要有"打击",那种让 你内心感到瓦凉瓦凉的打击!我在软件测试这个行业工作了12年之久,截至5年前,我 一直很愉悦地,内心充盈地做着黑盒测试,曾几何时我也觉得最好离"开发"远远的,因为 很多人都说:女孩子做测试挺好的~~ 但是,我遇到很一个非常现实而残忍的问题:"裁员",想想自己也挺奇葩的,在一个公司竟然待了12年之久,在这12年里,因为各种原因,我经历了大大小小的裁员有5次之多,一有裁员需求,老板第一个考虑的就是测试人员。每一次裁员,都是自己团队里的兄弟姐妹,我要亲自告诉他或她,因为公司现在裁员,需 要你离开公司,虽然你的工作是合格的,甚至是优秀的~~然后我要鼓起勇气陪着哭泣的他或她去立刻办理离职手续,一刻也不能停留~~你能想象我内心的崩溃吗?每一次我都会问为什么又是我们?每一次老板都会坦率地告诉我,为什么裁员考虑的是我们测试团队:就 是因为可取代性太强了!!我真的实实在在意识到了黑盒测试的无力。 公司在寒冬时,需要"蓄积能量",也就是需要减少开支,老板就要开始衡量,哪类研 发人员被裁,后续如果公司渡过难关后补起来比较容易,很不幸,每一次评估下来都是测 试人员。有个声音在我脑海里越来越清晰:不能这样,我们团队不能总是做可取代性强的 工作!!所以测试的发展方向是什么?我要有什么样的技能才能改观老板对我们的认知??我开始在网上找,当然也在51testing这样专业的网站上找寻,我找寻的结果是:未来的 测试应该是以自动化为主,手动测试为辅。所以测试人员必须要学会编程,因为测试是一 个无穷尽的工作,如何体现测试人员的价值,就是在单位时间内能有更多的产出,有让老 板瞠目结舌的产出!! 怎么学习Python在第二类问题中有详细说明,期间遇到的困难实在太多了,首要的 问题就是团队的信心不足,我们离开coding实在太久了,这个困难,我只能说,受到的 打击越大,越深,信心就会越足,容许我先哭一会~~ 除了这些形而上的困难,当然也有 实实在在的困难,我举一个实际且非常具体的问题:电脑1开发的脚本,可以正常运行,移植到电脑2就无法运行? 我们在开发时遇到上述问题,开发者开始一直纠结是电脑环境的问题,问题一直在发散,一直在发散,最后问题越来越复杂,搞到最后不可收拾......,最后他告诉我,这个开发任务无法进行@_@,这个小伙子成功在他的小主管的心里留下了:解决实际问题差的印象...... 他的问题在于没有回到问题的本质:Python的作用是定位,操作;就首先回到确认 窗口是否定位的思路上(当时他竟然还质疑他的小主管:窗口肯定定位了,因为在他的开 发电脑上都是定位的好好的*_*):真的发现窗口没有被成功定位。开发者就很困惑,为什么在电脑1是好的,电脑2就不行。他根本没想到是定位出的问题,所以连简单的确认动作也没做!然后再网上一通乱搜,真的越搜越晕,越搜问题越发散。
python webdriver 项目实战
第5章测试模型与测试脚本优化 第一节、测试模型介绍 线性测试 通过录制或编写脚本,一个脚本完成用户一套完整的操作,通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用webdriver API 所编写的脚本也是这种形式。 脚本一 脚本二
通过上面的两个脚本,我们很明显的发现它的问题: 一个用例对应一个脚本,假如界面发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。 这种模式下数据和脚本是混在一起的,如果数据发生变也也需要对脚本进行修改。 这种模式下脚本的可重复使用率很低。 模块化与库 我们会清晰的发现在上面的脚本中,其实有不少容是重复的;于是就有了下面的改进。 login.py quit.py 测试用例:
注意,上面代码并非完整代码,不能运行。 通过上面的代码发现,我们可以把脚本中相同的部分独立出来,形成模块或库;当脚本需要进行调用。这样做有两个好处: 一方面提高了开发效率,不用重复的编写相同的脚本;另一方面提高了代码的复用。 数据驱动 数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而引起结果改变。这显然是一个非常高级的概念和想法。 其实,我们能做到的是下面的形式。 d:\abc\data.txt
图4.x #coding=utf-8 from selenium import webdriver import os,time source = open("D:\\abc\\data.txt", "r") values = source.readlines() source.close() #执行循环 for serch in values: driver = webdriver.Firefox() driver.get(".xxxx.") driver.find_element_by_id("kw").send_keys(serch) ..... 不管我们读取的是txt 文件,还是csv、excel 文件的之类,又或者是数组、字典函数。我们实现了数据与脚本的分离,换句话说,我们实现了参数化。我们仍一千条数据,通过脚本的执行,可以返回一千条结果出来。 同样的脚本执行不同的数据从而得到了不同的结构。是不是增强的脚本的复用性呢! 其实,这对开发来说是完全没有什么技术含量的;对于当初QTP 自动化工具来说确是一个买点,因为它面对的大多是不懂开发的测试。
之前有介绍过selenium的自动化测试框架,随着Python这种脚本语言的强大功能越来越被广大的程序员所重视,这种之前在国内流行度不高的语言近来气势高涨。各种第三方模块层出不穷。这里Jason介绍下之前用过的python自动化测试的一个框架PAMIE,留下点memory。 PAMIE(Python Automated Module For Internet Explorer),PAMIE它与selenium差不多,能让你如同写JS一样来操作IE浏览器。包括自动启动,访问链接,设置文本框值,获取按钮,执行点击事件,甚至执行页面JS方法等等。 首先我们需要PAMIE Package和您python版本对应的python win32扩展。 PAMIE我们能从这里下载。 python win32扩展我们能从这里下载。 在PAMIE压缩包中有相关的docs文件,介绍了PAMIE的API使用说明。2.X版本与3.x版本在引用的时候有稍许差异。这里简单的举个例子。 打开网页相关的网页: ie.navigate(‘url’) doc化ie frame然后运行相应的脚本 mainFrame=ie.getFrame(‘main’) pwindow=mainFrame.document.parentWindow pwindow.execScript(‘XXXX’) 通过DOM得到或者设置相应的值 doc.getElementById(‘XXXX’).value=XXXXX 填文本框 ie.setTextBox(‘firstname’,'FirstName’) ie.setTextBox(‘lastname’,'LastName’) 选择下拉菜单: ie.selectListBox(‘state’,”MS”) 方形选择框: ie.setCheckBox(‘cxbx’,1)#123或*号等都是“勾选”的意思”空字符串代表取消选择 圆形选择框: 这里选择Jazz ie.setRadioButton(“music”,”Jazz”)#music是这个选择列表的名字,从网页源代码里找出 最后提交按钮 ie.clickButton(“Submit”)
第六周 A....... 1.每个类的定义必须包含一个初始化方法,该初始化方法的名称是什么?·__init__(两边各2个下划线) 2.Python语言中,函数和方法的主要区别是什么? ·函数在类之外定义,而方法在类当中定义,方法是类的一部分。 4.假设你有以下类和方法的定义(省略了部分代码): class My_Class: … def my_method(self, value1, value2): """假设该方法有2个参数,该方法可以完成某种功能。""" … my_object = My_Class() 最后一行定义了一个名称为my_object的变量,该变量是My_class类的一个对象。以下哪个是使用该对象my_method 方法的正确语法? ·my_object.my_method(1, 2) 5.我们希望小球具备移动的能力,以下哪个设计是正确的? ·class Ball: def __init__(self, pos, r): self.center = pos self.radius = r def move(self, move_vector): """通过加上给定矢量的分量来改变小球的位置""" self.center[0] += move_vector[0] self.center[1] += move_vector[1] # balls : 为Ball对象的列表 balls = … 6.多数面向对象的编程语言允许方法重载,即同一个方法名称可以因其参数的不同而出现多个版本。本题你将通过试验来体会什么是方法重载并验证Python是否支持重载。 请运行以下Python代码: class Overload(object): def __init__(self, param1): pass def __init__(self, param1, param2): pass obj1 = Overload(1) obj2 = Overload(1, 2) Overload类定义完成后,我们希望创建2个Overload对象,如果Python支持重载,你将能够使用1个参数创建一个Overload 对象,也能够使用2个参数创建一个Overload对象。通过测试,Python是否支持重载? ·不支持 9.按照Python建议的编码格式要求(PEP 8),类的名称应当遵循首字母大写规则,以下哪些是符合要求的类名称? ·Student ·ImageInfo ·BankAccount 10.Python语言中对象这一术语的含义是什么?请从下面的下拉式列表中选择正确的答案。 ·根据类定义创建的一个具体实例 第六周第一页
1.what does the following code do?(B) def a(b, c, d): pass A.defines a list and initializes it B.defines a function, which does nothing C.defines a function, which passes its parameters through D.defines an empty class 2.what gets printed? Assuming python version 2.x(A) print type(1/2) A.
自动化测试框架的安装及使用 Python + Nosetests + Webdriver + Eclipse 目录 自动化测试框架的安装及使用 (1) Python + Nosetests + Webdriver + Eclipse (1) 1 Python + Nosetests安装及配置 (2) 1.1 Python安装,以Windows为例 (2) 1.2 Python配置 (2) 1.3 Python插件安装 (2) 1.3.1 setuptools安装 (2) 1.3.2 pip安装(可选安装,如需在线安装selenium,则需要安装) (3) 1.3.3 Nosetests安装 (3) 1.3.4 nose-testconfig安装 (3) 1.3.5 Unittest 安装 (3) 1.3.6 requests安装 (4) 1.3.7 nose-selenium-0.07安装 (4) 1.3.8其他插件安装 (4) 2 Webdriver 安装 (4) 2.1 Selenium Webdriver安装 (4) 2.2 Chrome Webdriver安装 (5) 2.3 IE Webdriver安装 (5) 3 Eclipse安装 (5) 4框架使用说明 (7) 4.1代码目录结构 (7) 4.2 使用说明 (8)
1 Python +Nosetests安装及配置 下面所有安装均以离线安装为例(考虑公司网络问题),以下所有安装文件均可从“/hjqa/06 技术分享/03 Selenium/automation”中获取 1.1 Python安装,以Windows为例 获取python-2.7.6.msi或者python-2.7.5.msi(/hjqa/06 技术分享/03 Selenium/SeleniumInstall/Python_pack)双击msi文件安装即可 1.2 Python配置 右单击我的电脑(或计算机)->属性->高级->环境变量,在系统变量中找到PATH变量并编辑,添加Python安装路径到PATH变量(如:C:\Python27;) 打开cmd窗口,运行python,显示如下图: 1.3Python插件安装 1.3.1 setuptools安装 目的:为安装其他插件做准备 获取setuptools-3.3.zip,拷贝setuptools zip包到C盘根目录解压,然后打开cmd窗口,切换路径至setuptools-3.3,运行python setup.py install,如下图所示 安装完成后,可以在C:\Python27\Lib\site-packages下面找到setuptools文件夹及相
Python 自动化测试部署中单元测试框架unittest 1.test fixture a)测试准备前要做的工作:setUp() 作测试用例的准备工作,包括需要运行某个测试用例所需要的前提条件,在mqtt 的测试中,包括了登陆django_web页面,数据库中数据的准备,连接ssh,以及启动agent和app。该方法在类:class FunctionMqtt_Login中 b)测试执行完后要做的工作:tearDown() 对于以后的TestCase留下一个干净的环境,再mqtt的测试中,包括了关闭anget 以及app。该方法在类:class FunctionMqtt_Logic中 2.test case(测试案例) 最小的测试单元 在mqtt的测试中,test case 包括了 def test_a_agent_login_01。。。。。。等test case。 该test case的方法在类:class FunctionMqtt_Logic中 3.test suite(测试套件) 测试案例的集合 在mqtt测试中, def _FM_Login_suite(suite): suite.addTest(FunctionMqtt_Login("test_a_agent_login_01")) ........ return suite 4.test runner(测试运行器) 测试执行的组件 在mqtt测试中, 通过调用test suite,从而运行其中的test case: suite_PM_Login = PerformMqttLogin._PM_Login_suite(suite) test_suite = suite_PM_Login runner = xmlrunner.XMLTestRunner(output='test-reports/%s' % branch) runner.run(test_suite) 一个测试用例的基本测试流程: 测试前准备环境的搭建(setUp)---> 执行测试代码(runner)---> 测试后环境的还原(tearDown) 一个TestCase的实例就是一个测试用例,就是上面的一个完整的测试流程 多个测试用例集合在一起,就是Test suite。 该框架的基本测试运行流程: 测试前准备环境的搭建(setUp)---> 加载TestCase到TestSuite ---> TextTestRunner来运行TestSuite --->测试后环境的还原(tearDown)