软件测试项目实战第5版 课件 第七章性能测试_第1页
软件测试项目实战第5版 课件 第七章性能测试_第2页
软件测试项目实战第5版 课件 第七章性能测试_第3页
软件测试项目实战第5版 课件 第七章性能测试_第4页
软件测试项目实战第5版 课件 第七章性能测试_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章性能测试掌握性能测试利器,提升系统性能质量于艳华长春职业技术大学7.1性能测试简介一个优秀的软件系统不单单具有良好的功能,还需要有过硬的性能,一个只通过功能测试的系统,只能算“可用”,而不能算是“好用”。当然,性能测试需要基于功能测试,只有系统功能稳定了,性能测试才有意义。性能测试主要包含两个特性:时间和资源。时间指系统处理客户请求的时间,主要用响应时间和吞吐量来衡量,而资源则是指测试过程中系统资源消耗情况,最受关注的资源包括CPU、内存、磁盘。性能测试方法主要包括:性能测试、配置测试、并发测试、负载测试、压力测试、稳定性测试。7.1性能测试简介性能测试:在测试环境和测试目标确定的情况下,测试系统是否达到宣称的能力。配置测试:系统具有一定的测试基础时,通过修改环境配置,如服务器参数等,对比之前的测试结果进行优化。并发测试:模拟多个用户并发使用系统,测试系统是否存在死锁、内存泄露等问题。负载测试:逐渐向系统添加压力,观察系统资源消耗情况,直到某一项资源达到极限,一般用于度量系统的性能容量,寻找系统瓶颈为系统调优提供数据。压力测试:在系统承受一定的压力的情况下,测试系统是否会出现错误。系统压力包括CPU、内存、磁盘、网络等方面的压力,施加压力的方法包括利用工具占用系统资源、增加并发量等。稳定性测试:在系统承受一定压力的情况下,运行一段时间,测试系统是否平稳运行。7.1性能测试简介这几种测试方法是相辅相成的,一种测试方法中可能借助另一种测试方法,例如在进行负载测试、压力测试或稳定性测试时,会使用并发测试方法。另外,几种测试方法之间的界定也比较模糊,当负载测试的压力较大时,可以看作是压力测试,当压力测试的时间较长时,可以看作是稳定性测试。性能测试的主要目标是测试、评估软件系统的性能,获取软件系统的参数指标,并协助开发进行调优。不管哪种测试方法,最终目的都是提高系统质量,那么根据测试目标和系统特性选用适合的测试方法即可。性能测试需要借助测试工具,毕竟完全依靠手工进行性能测试需要付出很大的代价,不仅是人力成本和经济成本,还有时间成本。测试工具的使用不仅能够提高测试效率,还可以弥补手动测试难以捕获的一些缺陷。7.2LoadRunner简介LoadRunner是HP公司提供的一款性能测试工具,通过模拟成千上万个用户实施并发操作,测试系统的性能,并且提供详细的测试结果分析,协助用户查找问题。LoadRunner的优势在于节约了人力成本和时间成本。纯人工进行并发测试不仅需要大量的人手和机器,还需要测试人员进行充分的沟通,默契地进行操作。使用LoadRunner就可以一个人模拟上万个用户,压缩了成本,也提高了效率。7.2LoadRunner简介LoadRunner的主要组件包括:①VirtualUserGenerator。捕捉用户业务流程,并且自动生成脚本。②Controller。设计场景,主要包括设置不同脚本的虚拟用户数量、迭代次数、执行时间等。③LoadGenerator。模拟用户向服务器发送请求。④Analysis。分析测试结果,辅助测试人员进行测试分析。7.3LoadRunner安装安装注意事项:①安装前,把所有的杀毒软件和防火墙关闭。②若以前安装过LoadRunner,需将其卸载。③安装路径不要带中文字符。LoadRunner12.55已经不再支持WindowsXP系统,建议浏览器使用IE10以上版本。启动安装包,如图7-1所示。图7-1

LoadRunner12.55安装文件右击“HPLoadRunner12.55CommunityEdition.exe”,选择“以管理员身份运行”(建议安装时选择“以管理员身份运行”)。7.3LoadRunner安装弹出窗口,选择文件存放地址,如图7-2所示,可选择默认路径。单击“Install”按钮。若安装过程中被计算机上安装的杀毒软件拦截,均选择允许操作。安装向导会验证计算机是否含有软件安装运行的必备组件,缺少组件时,会弹出窗口显示需安装的组件。单击“确定”按钮将自动安装所需组件,如图7-3所示。必须先安装这些必备程序才能安装HPELoadRunner(LoadRunner的安装需要获得其环境的支撑)。图7-2

安装(1)图7-3

安装(2)7.3LoadRunner安装待组件安装完成后,就会弹出窗口,选择要安装的产品,单击“下一步”按钮,如图7-4所示。勾选“我接受许可协议中的条款”,单击“下一步”按钮,如图7-5所示。图7-4

LoadRunner安装(3)图7-5

LoadRunner安装(4)7.3LoadRunner安装选择安装路径,安装路径不能含有中文字符,单击“下一步”按钮,如图7-6所示。单击“安装”按钮将进行程序的安装,如图7-7所示。图7-6

LoadRunner安装(5)图7-7

LoadRunner安装(6)7.3LoadRunner安装正在安装“HPELoadRunner”,如图7-8所示。图7-8

LoadRunner安装(7)7.3LoadRunner安装耐心等待程序安装。安装过程中会弹出身份验证界面,若无指定代理使用的证书,则去掉勾选“指定LoadRunner代理将要使用的证书”,单击“下一步”按钮,如图7-9所示。注:若有LoadRunner代理证书则默认勾选“指定LoadRunner代理将要使用的证书”并添加CA证书文件,若没有证书文件则必须取消勾选,否则安装不能继续。图7-9

LoadRunner安装(8)7.3LoadRunner安装LoadRunner安装完成。单击“完成”按钮,如图7-10所示。关闭安装弹出窗口(对于NetworkVirtualization,根据实际需要选择是否安装)。安装完成后可在桌面上看到安装的Analysis、Controller、VirtualUserGenerator快捷图标。

图7-10

LoadRunner安装(9)7.4录制与回放脚本具体操作步骤如下所示。步骤一:打开LoadRunner,依次单击“File”→“NewScriptandSolution”选项,如图7-11所示。图7-11

新建脚本7.4录制与回放脚本步骤二:在打开的对话框中,选择“Web.HTTP/HTML”,在“ScriptName”框中输入脚本名称“WebHttpHtml1”,单击“Create”按钮,如图7-12所示。图7-12

新建脚本7.4录制与回放脚本在VUG界面中,要理解脚本的以下三大部分,如图7-13所示。●Vuser_init:用于存放应用程序初始化脚本(只执行一次)。●Action:用于存放实际操作脚本(可执行多次)。●Vuser_end:用于存放应用程序注销和关闭的脚本(只执行一次)。图7-13

VUG界面7.4录制与回放脚本步骤三:单击脚本录制按钮,本教程测试的项目是课程管理系统,项目部署完成后的地址为192.168.46.100/login(输入项目发布机器的IP地址)。具体脚本录制过程如图7-14~图7-20所示。图7-14

准备录制脚本图7-15

脚本录制设置17.4录制与回放脚本图7-16

脚本录制设置2图7-17

开始录制7.4录制与回放脚本图7-18

安全警告全部同意,勾选专用网络图7-19

安全警告全部同意,勾选专用网络图7-20

工具栏7.4录制与回放脚本录制:登录系统,输入教务管理员的用户名和密码(见图7-21),将脚本存放位置改为vuser_Action,单击“系管理”模块,再单击“新增”按钮,设置系名称为“计算机系”,如图7-22所示。图7-21

录制登录图7-22

修改脚本存放位置7.4录制与回放脚本图7-23

录制新增系管理步骤四:查看登录的脚本是否录制到Vuser_init中,如图7-23所示。图7-23

登录脚本存放到Vuser_init7.4录制与回放脚本查看登录的脚本是否录制到Action中,如图7-24所示。图7-24新增系管理脚本存放到Action7.5关联在LoadRunner中,登录关联是一个关键步骤,它确保了脚本能够在回放时正确地模拟用户的登录行为。在登录流程中,服务器会返回一个独特的会话标识符(如token),用于验证用户身份。LoadRunner的VuGen录制脚本时,会记下这个token。但每次登录token都不同,所以直接用录的token回放会失败。为解决此问题,LoadRunner有“关联”功能。它能把脚本里硬编码的token换成从服务器响应里动态抓的值。回放时,LoadRunner会自动抓新的token,用在后续请求里,保证登录能成功。7.5关联在这次关联中用到两个函数:web_reg_save_param函数:在服务器响应中,我们需要找到参数值(比如token),然后把这个值“存”起来,放到一个我们指定的变量里。之后,脚本在运行时就可以用这个变量来“代替”那些原本写死的会话标识符,保证每次回放脚本时都能顺利登录。web_add_auto_header函数:在登录关联测试中,web_add_auto_header函数用于自动向后续HTTP请求添加指定头部信息,如会话标识符。它确保每次回放脚本时,请求能携带最新的认证信息,维持会话状态。测试人员只需在登录后设置此函数,LoadRunner即会自动处理后续请求的头部添加。7.5关联1.首先在vuser_int中找到登录脚本(有之前填的账号密码数据的代码为登录脚本)图7-25找到登录脚本7.5关联2.鼠标放在登陆脚本上点击右键,选择快照,查看返回数据中的token进行复制。图7-25查找登录脚本中token值7.5关联3.将光标放在登陆脚本前面,在右面工具框中搜索边界提取器,并打开它。图7-26打开边界提取器7.5关联4、把复制的token左右边界放进去,再给它起一个变量名以供后续使用(这里起的变量名为guanlian)。图7-27

填写边界提取器7.5关联5.下滑到登陆下面的脚本,右键查看它的快照,在RawData中找到跟token后一样的乱码的头部Authorization进行复制。图7-28

填写边界提取器7.5关联6.将光标放在登录脚本下面,右面工具搜索框中搜索web_add_auto_header函数,并将刚才复制的头部Authorization填在Name中,将刚才边界提取器中起的变量名{guanlian}填到Value中。图7-29

填写边界提取器7.5关联步骤四:单击回放脚本按钮,如图7-30所示。图7-30

点击脚本回放7.5关联回放成功界面如图7-31所示。图7-31

脚本回放成功7.6思考时间思考时间指模拟人在使用软件时思考的时间。设置脚本运行的思考时间(见图7-32):图7-32

思考时间7.6思考时间●Ignorethinktime:忽略思考时间。●Replaythinktimeasrecorded:按照录制时获取的thinktime回放脚本。●Multiplyrecordedthinktimeby:按照录制时获取值的整数倍回放脚本。●Userandompercentageofrecordedthinktime:制定一个最大和最小的比例,按照两者之间的随机值回放脚本。●Limitthinktimeto:限制thinktime的最大值,脚本回放过程中,如果发现有超过这个值的,用这个最大值代替。LoadRunner采用脚本中定义事务来达到这一要求。事务就是在脚本中定义的某段操作,更确切来说,就是一段脚本语句。除了要衡量整个脚本的性能,还需要衡量脚本中某一段或几段操作的性能,以便更详细地知道具体是用户的哪些动作对系统的性能影响比较大。7.7插入事务定义事务时,首先在脚本中找到事务的开始和结束位置,然后分别插入一个事务起始标记。这样,当脚本运行的时候,LoadRunner会自动在事务的起点开始计时,脚本运行到事务的结束点时计时结束,系统会自动记录这段操作的运行时间等性能数据。7.7插入事务在脚本运行完毕以后,系统会在结果信息中单独反映每个事务的运行结果。在新增系功能插入事务,如图7-33所示。图7-33

插入事务7.7插入事务回放脚本,如图7-34所示。图7-34

回放脚本7.8检查点功能检查点的功能主要用于验证某个界面上是否存在指定的Text对象。在使用LoadRunner测试Web应用时,可以检查压力较大时Web服务器能否返回正常的页面。LoadRunner提供的检查点分为以下两种:●文本检查点:web_reg_find()。●图片检查点:web_image_find()。本书使用的是文本检查点。启用检查点功能:依次打开RuntimeSetting→InternetProtocol→Perferences。7.8检查点功能启用检查点,如图7-30所示。将检查点设为新增区域,具体设置如图7-31和图7-32所示。图7-30

启用检查点7.8检查点功能调出工具箱。图7-31

调出工具箱(1)7.8检查点功能在工具箱中搜索检查点web_reg_find函数并打开,填入所检查的内容。图7-32

设置检查点(2)7.8检查点功能检查点设置完成结果如图7-33所示。图7-33

检查点设置完成7.8检查点功能回放脚本如图7-34所示。图7-34

回放脚本7.9参数化脚本参数化,就是针对脚本中的某些常量,定义一个或多个包含数据源的参数来取代它,让场景中不同的虚拟用户在执行相同的脚本时,分别使用参数数据源中的不同数据代替这些常量,从而达到模拟多用户真实使用系统的目的,具体操作如图7-35~图7-38所示。7.9参数化1.选中要参数化的数据右键,选中ReplacewithParameter再点击CreateNewParameter。图7-35

设置参数化(1)7.9参数化2.给参数内容起个变量名称这里起的file,点击ok。图7-36

设置参数化(2)图7-37

设置参数化(3)7.9参数化3.再次选举中file鼠标右键,选中ReplacewithParameter再点击CreateNewParameter。

图7-38

设置参数化(4)7.9参数化如图7-39所示,Selectcolumn的方式默认选择“Bynumber”,并且设置number为1,即选择第一列参数。当然也可以选择“Byname”,选择变量参数名称即可。“Selectnextrow”用于设置参数取值方式,主要有以下4种取值方式,由于用户名不能重复,在此选择取值方式为“Unique”。7.9参数化①Sequential:按照顺序依次取值。②Random:随机取值。③Unique:唯一取值,为每个虚拟用户分配唯一的一条数据。④Samelineas***:当多个参数时,取某一个参数的同一行。“Updatevalueon”用于设置参数更新周期,主要有以下三种更新周期,在此选择每次迭代时更新。①Eachiteration:每次迭代时更新参数的值。②Eachoccurrence:每次使用该参数时更新参数的值。③Once:执行脚本只取一次值,中途不更新参数的值。7.9参数化4.填写并设置参数数据。图7-39

参数化设置,单击“Close”按钮保存7.9参数化回放脚本图7-41

回放脚本7.9参数化图7-42

回放成功7.10集合点一般的并发过程仅仅体现在开始执行的一刹那,随着服务器对请求的响应时间的不一致或系统环境条件的限制,用户的执行速度将不一致,在运行的过程中能够集合到一点的可能性很小,这种并不是真正意义的并发。系统压力最大的情况是:所有用户都集合到系统瓶颈的某个点上进行操作。从脚本的角度讲,这个点就是执行脚本的某一条或一段语句,为了真实模拟这种情况,LoadRunner提供集合点的功能,实现真正意义上的并发。注意:集合点只能放在action中,而不能放在vuser_init()和vuser_end()中。在脚本中插入集合点(见图7-43)。在工具栏中找“Desgin”选项,选择“InsertinScript”选项,选择“Rendezvous”选项。在打开界面中给集合点起个名字如图7-44所示。在脚本中设置完检查点后需要到场景设置中设置集合点,点击上方菜单栏中的Scenario、Rendezvous进入到设置集合点的页面。如图7-47。7.10集合点图7-43

插入集合点7.10集合点图7-44

为集合点起名字7.10集合点设置集合点用户数,具体如图7-45所示。图7-45

调出场景控制台7.10集合点设置用户数后进入场景界面,设置如图7-46所示。图7-46

设置场景界面7.10集合点图7-47

设置检查点策略7.11场景模拟某些极端场景,对软件的各方面性能进行接近真实场景的测试。场景设置过程如图7-48~图7-55所示。图7-48

场景界面7.11场景图7-49

初始化设置7.11场景图7-50

开始设置7.11场景图7-51

运行时间设置7.11场景图7-52

停止设置7.11场景图7-53

场景设置完成7.11场景运行场景图7-54

运行场景7.11场景

图7-55

场景运行完毕7.12结果分析结果分析是为了更直观地观察系统的性能指标,从而方便对系统进行评估。结果分析过程如图7-56~图7-62所示。图7-56

结果分析7.12结果分析图7-57

分析概括7.12结果分析图7-58

运行用户7.12结果分析图7-59

每秒点击量7.12结果分析图7-60

吞吐量7.12结果分析图7-61

事务总述7.12结果分析图7-62

平均事务响应时间7.13CVIT课程管理系统项目实战1.脚本录制:(1)脚本一:脚本名称:ZAdd。脚本内容:教务管理员登录、进行新增专业操作。具体要求如下:登录操作存放在vuser_int,新增操作存放在Action。专业名称任意选择,所属系任意选择,操作设置事务,事务名称:T_ZAdd。设置检查点,使用提交操作成功服务器的响应正文内容作为检查点。在新增销售订单保存操作前添加集合点,集合点名称:R_ZAdd。实战训练:按照要求如下图录制脚本。7.13CVIT课程管理系统项目实战图7-63

项目实战-录制脚本(1)7.13CVIT课程管理系统项目实战(2)脚本二:脚本名称:SAdd。脚本内容:教务管理员登录、进行新增学生操作。具体要求如下:登录操作存放在vuser_int,新增操作存放在Action。所有信息任意选择,新增操作设置事务,事务名称:T_SAdd。设置检查点,使用新增操作成功服务器的响应正文内容作为检查点。在新增操作前添加集合点,集合点名称:R_SAdd。7.13CVIT课程管理系统项目实战图7-64

项目实战-录制脚本(2)7.13CVIT课程管理系统项目实战2.脚本回放:使用回放功能对脚本的正确性进行校验。(1)脚本一脚本回放具体要求如下:运行脚本,查看回放结果,要求脚本回放能成功实现新增专业业务。登录操作若需要关联,使用关联函数web_reg_save_param_ex()。(2)脚本二脚本回放具体要求如下:运行脚本,查看回放结果,要求脚本回放能成功实现新增学生业务。实战训练:对登录进行关联,成功回放脚本。7.13CVIT课程管理系统项目实战图7-65

项目实战-登录关联7.13CVIT课程管理系统项目实战图7-66

项目实战-脚本回放成功7.13CVIT课程管理系统项目实战3.脚本参数设置要求:脚本回放成功后按要求设置脚本参数。(1)脚本一参数化具体要求如下:新建参数化文件Znamer.dat,文件中包含Zname字段,Znamme输入10条专业名称。对专业名称进行参数化设置:专业名称使用参数Znamme,每次迭代顺序取值。脚本迭代次数3次。(2)脚本二参数化具体要求如下:学号前四位不变,使用RondamNumber参数参数化后四位,性别使用任意方法参数化。实战训练:按照题目进行参数化,成功回放脚本3次。脚本一:点击Parameters进入参数页面,新建参数Zname,格式选择文件,将数据专业名称参数化。7.13CVIT课程管理系统项目实战图7-67

项目实战-编写参数化文件7.13CVIT课程管理系统项目实战图7-68

项目实战-参数化数据7.13CVIT课程管理系统项目实战脚本二:点击Parameters进入参数页面,新建参数Zname,格式选择文件,将数据专业名称参数化。将学号邮箱性别对应的数据参数化。脚本执行3次。图7-69

项目实战-参数化脚本7.13CVIT课程管理系统项目实战4.场景设置:按要求设置虚拟用户个数以及进行场景配置。脚本修改:新增专业前添加思考时间35秒。脚本修改:新增学生集合点前添加思考时间30秒。选择新增专业和新增学生两个脚本进行场景设置。用户分配选择百分比模式:新增商品占比40%。场景运行模式选择实际计划。新增专业和新增学生集合点策略:当5个用户到达集合点时释放,超时时间30秒。全局计划:在每个虚拟用户运行前将其初始化;启动10个用户(每5秒启动5个)执行5分钟,再启动10个用户(每5秒启动5个)执行5分钟,执行完成后停止10个用户(每5秒停止5个)再执行5分钟,然后停止所有用户(每5秒停止5个)。实战训练:按照题目要求修改脚本后。进入新增专业脚本,在上方菜单中选择Integrations,在下拉框选择CreateControllerScenario进入Controller设计场景。7.13CVIT课程管理系统项目实战图7-70

项目实战-设计场景-添加脚本(1)7.13CVIT课程管理系统项目实战在场景中加入两个脚本后,点击上方菜单中Scenario,选择下拉框中的Rendzvous...进入到设置集合点的界面,如图点击Policy,按照要求设置集合点。点击Scenario,点击ConventScenariototheVuserGroupMode将线程组设置为百分比模式。图7-71

项目实战-设计场景-集合点(2)7.13CVIT课程管理系统项目实战图7-72

项目实战-设计场景(3)7.13CVIT课程管理系统项目实战5.图形结果分析:场景执行完成后对测试结果进行查看。实战训练:在测试场景执行完成后,点击上方菜单栏中的Results弹出下拉框,选择AnalyzeResults进入到Analysis中进行结果分析。如图7-72。图7-73

项目实战-结果分析7.14PO设计模式一、简介PO是PageObject(页面对象)的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一,核心思想是通过对界面元素的封装减少冗余代码,主要体现在对界面交互细节的封装,也就是在实际测试中只关注业务流程;同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。7.14PO设计模式

项目结构基于课程管理系统设计了po模式的项目结构如下:图7-74

PO结构图7.14PO设计模式三、例题根据测试用例编写脚本:

用户名密码测试数据预期结果admin123456测试系添加成功!!!admin123456

请输入系名称admin123456字符长度超过16字符长度asdlkjfalksdjflkjasdlfkjasd添加失败,请重试!admin123456!@#添加成功!!!admin123456153添加成功!!!7.14PO设计模式1.新建PageObjectModel文件夹;2.在PageObjectModel文件夹下新建driver文件夹和Website文件夹;3.在driver文件夹下新建driver.py文件存放浏览器驱动;4.在Website文件夹下新建test_case文件夹、test_report文件夹、test_data文件夹;5.在test_case文件夹下新建model文件夹和page_object文件夹;6.在model文件夹下新建function.py文件封装截图、数据驱动读取等方法;7.在model文件夹下新建myunit.py文件封装unittest框架中的Setup(添加5秒的智能等待和浏览器窗口最大化)和tearDown(退出浏览器)等方法;7.14PO设计模式8.在page_object文件夹下新建BasePage.py文件封装selenium的基础操作类方法(get、find_element等);9.在page_object文件夹下新建LogingPage.py文件,引入BasePage.py中封装好的方法,引入By方法类,封装登录用例页面元素位置和操作(使用CLASS_NAME方法封装用户名输入框,使用ID方法封装密码输入框、使用TAG_NAME方法封装登录按钮位置,封装输入用户名、密码、点击登录按钮等操作);10.在page_object文件夹下新建AddPage.py文件,引入BasePage.py中封装好的方法,引入By方法类,封装好系管理添加页面元素(使用LINK_TEXT方法封装系管理按钮,使用XPATH方法封装新增按钮,使用XPATH方法封装系管理名称输入框,使用CSS方法封装保存按钮,封装点击系管理按钮、点击新增按钮、输入系管理名称、点击保存按钮等操作),封装添加成功以及添加失败的提示信息文字;11.在test_report文件夹新建srceenshot文件夹存放测试截图;7.14PO设计模式12.在test_data文件夹新建test_csv.csv文件存放测试数据;13.在test_case文件夹下新建test_login.py文件,引入unittest、ddt以及之前封装好的model,LoginPage,AddPage中的方法类,根据用例编写5条测试用例脚本,创建data参数来接收测试数据,并使用数据驱动输入用户名和密码(XTGLY/123456),使用数据驱动输入系管理名称,然后进行截图操作,最后对每一条测试用例进行assertIn断言操作,对比提示信息是否和预期一致;14.在Website文件夹下新建run_test.py文件使用discover方法执行test_add.py测试用例并引入HTMLTestRunner方法生成html测试报告(测试报告title名为:TestReport,description内容为erptest)。7.14PO设计模式案例解析:driver文件夹driver.py:该文件负责WebDriver的初始化。fromseleniumimportwebdriver

#从selenium库中导入webdriver模块#定义Driver函数,用于创建和管理浏览器驱动defDriver():

#创建一个Chrome浏览器的WebDriver实例

driver=webdriver.Chrome()

#返回创建的WebDriver实例,以便在其他地方使用

returndriver7.14PO设计模式2.2Website文件夹model文件夹:function.py:封装了辅助方法,如截图和数据驱动测试的实现。截图功能在测试失败时自动捕获页面状态,便于问题诊断。数据驱动测试允许测试用例使用外部数据源(如CSV文件、Excel表格或数据库)来动态提供测试数据。7.14PO设计模式importcsv

#导入csv模块,以便处理CSV文件#定义截图函数,用于截取浏览器当前页面的屏幕截图defjietu(driver,filename):

#构建文件路径,将截图保存到指定的文件夹中

filepath=r"E:\POM\Website\test_report\srceenshot\t"+filename+".png"

#使用driver对象的get_screenshot_as_file方法,将截图保存到filepath指定的路径

driver.get_screenshot_as_file(filepath)

#定义get_csv函数,用于从CSV文件中获取特定行的数据defget_csv(line):7.14PO设计模式

#打开CSV文件,使用with语句确保文件在操作完成后会被正确关闭

withopen(r"E:\POM\Website\test_data\test_csv.csv")asfile:

#创建csv.reader对象,用于读取CSV文件中的数据

reader=csv.reader(file)

#遍历CSV文件中的每一行,enumerate函数用于获取行号(从1开始计数)

forindex,rowinenumerate(reader,1):

#如果当前行号与函数参数line相等,则返回这一行的数据

ifindex==line:

returnrow

#打印当前行的数据,用于调试或查看文件内容

print(row)7.14PO设计模式myunit.py:定义了测试用例的setup和teardown方法。setup方法在每个测试用例执行前运行,用于初始化测试环境(例如,登录到应用程序)。teardown方法在每个测试用例执行后运行,用于清理测试环境(例如,登出应用程序)。

7.14PO设计模式fromPageObjectModel.driver.driverimport*

#从指定模块导入所有内容importunittest

#导入unittest模块,用于单元测试#定义一个测试类,继承自unittest.TestCase,表示这是一个测试用例类classStarEnd(unittest.TestCase):

#setUp方法在每个测试方法执行前都会被调用,用于设置测试环境

defsetUp(self)->None:

#调用Driver函数创建WebDriver实例,并赋值给self.driver

self.driver=Driver()

#设置隐式等待时间为5秒,意味着WebDriver会等待最多5秒直到元素可操作

self.driver.implicitly_wait(5)7.14PO设计模式

#调用maximize_window方法最大化浏览器窗口

self.driver.maximize_window()

#tearDown方法在每个测试方法执行后都会被调用,用于清理测试环境

deftearDown(self)->None:

#调用quit方法关闭浏览器,结束WebDriver会话

self.driver.quit()7.14PO设计模式page_object文件夹:

BasePage.py:作为所有页面对象的基类,提供了基本的页面操作方法,如点击元素、输入文本、等待元素加载等。此外,还包含一些辅助方法,如检查元素是否存在。fromtimeimportsleep

#从time模块导入sleep函数,用于暂停执行classPage():

#初始化方法,接收一个driver对象作为参数

def__init__(self,driver):

self.driver=driver

#将传入的driver对象保存为实例变量7.14PO设计模式

#基础URL,但这里的URL被错误地放在了HTML标签中,应该直接使用URL字符串

self.base_url="00/login"

#正确的基础URL

#私有方法_open,用于打开一个URL

def_open(self,url):

#构建完整的URL地址

url_=self.base_url+url

#使用driver对象的get方法打开URL

self.driver.get(url_)7.14PO设计模式#公开方法open,用于打开基础URL

defopen(self):

#调用私有方法_open,并传入基础URL

self._open(self.base_url)

#公开方法find_element,用于查找页面上的元素

deffind_element(self,*loc):

#使用driver对象的find_element方法查找元素,并返回该元素

#*loc表示接收任意数量的位置参数,这些参数将被传递给find_element方法

returnself.driver.find_element(*loc)7.14PO设计模式LoginPage.py:封装了登录页面的元素和操作,定义了如用户名输入框、密码输入框和登录按钮的定位和操作。

frommon.byimportBy

#导入By类,用于元素定位fromPageObjectModel.Website.test_case.page_object.BasePageimport*

#导入BasePage类#定义LoginPage类,继承自Page类classLoginPage(Page):

#类属性,用于存储登录页面元素的定位器

url=""7.14PO设计模式username=(By.ID,'username')

#用户名输入框的定位器

password=(By.NAME,'password')

#密码输入框的定位器

submit=(By.NAME,'login_button')

#登录按钮的定位器

#方法,用于在用户名输入框中输入用户名

defusername_1(self,username):

#调用find_element方法查找用户名输入框,并发送用户名

returnself.find_element(*self.username).send_keys(username)

#方法,用于在密码输入框中输入密码

defpassword_1(self,password):7.14PO设计模式#调用find_element方法查找密码输入框,并发送密码

returnself.find_element(*self.password).send_keys(password)

#方法,用于点击登录按钮

defsubmit_1(self):

#调用find_element方法查找登录按钮,并执行点击操作

returnself.find_element(*self.submit).click()#定义test_login函数,用于执行登录操作的测试deftest_login(driver,username,password):7.14PO设计模式

#创建LoginPage对象,传入driver

login=LoginPage(driver)

#打开登录页面

login.open()

#在用户名输入框中输入用户名

login.username_1(username)

#在密码输入框中输入密码

login.password_1(password)

#暂停1秒,等待页面响应

sleep(1)

#点击登录按钮

login.submit_1()

#暂停5秒,等待登录操作完成

sleep(5)7.14PO设计模式AddPage.py:封装了添加页面的元素和操作,定义了如添加新条目、编辑现有条目等功能的实现。frommon.byimportBy

#导入By类,用于元素定位fromPageObjectModel.Website.test_case.page_object.BasePageimport*

#导入BasePage类#定义AddPage类,继承自Page类classAddPage(Page):

#类属性,用于存储添加页面元素的定位器

url=""7.14PO设计模式xiguanli=(By.LINK_TEXT,'系管理')

#系管理链接的定位器

xinzeng=(By.XPATH,'//*[@id="app"]/div/div/section/section/main/div[2]/div[1]/div/div/div/div[2]/div[1]/div[1]/button')

#新增按钮的定位器

mingcheng=(By.ID,'departmentName')

#名称输入框的定位器

submit=(By.XPATH,'//*[@id="app"]/div/div/section/section/main/div[2]/div[1]/div/div/div/div[3]/div/div/footer/span/button[1]')

#提交按钮的定位器

error=(By.CLASS_NAME,'el-form-item__error')

#错误信息的定位器7.14PO设计模式success=(By.CLASS_NAME,'ant-notification-notice-description')

#成功通知描述的定位器

#方法,用于点击系管理链接

defxiguanli_1(self):

returnself.find_element(*self.xiguanli).click()

#方法,用于点击新增按钮

defxinzeng_1(self):

returnself.find_element(*self.xinzeng).click()

#方法,用于在名称输入框中输入名称

defmingcheng_1(self,mingcheng):

returnself.find_element(*self.mingcheng).send_keys(mingcheng)7.14PO设计模式#方法,用于点击提交按钮

defsubmit_1(self):

returnself.find_element(*self.submit).click()

#方法,用于获取失败和成功通知的文本

defsuccess_1(self):

returnself.find_element(*self.success).text

#方法,用于获取错误信息的文本

deferror_1(self):

returnself.find_element(*self.error).text#定义test_add函数,用于执行添加操作的测试deftest_add(driver,mingcheng):7.14PO设计模式

#创建AddPage对象,传入driver

add=AddPage(driver)

#点击系管理链接

add.xiguanli_1()

#暂停1秒,等待页面响应

sleep(1)

#点击新增按钮

add.xinzeng_1()

#暂停1秒,等待页面响应

sleep(1)7.14PO设计模式#在名称输入框中输入名称

add.mingcheng_1(mingcheng)

#暂停1秒,等待页面响应

sleep(1)

#点击提交按钮

add.submit_1()

#暂停3秒,等待添加操作完成

sleep(3)7.14PO设计模式test_login.py:包含针对新增系功能的测试用例,这些测试用例通过调用LoginPage、AddPage对象中的方法来验证新增流程的正确性。fromPageObjectModel.Website.test_case.page_object.LoginPageimport*

#导入LoginPage类fromPageObjectModel.Website.test_case.page_object.AddPageimport*

#导入AddPage类fromPageObjectModel.Website.test_case.modelimportmyunit,function

#导入myunit模块和function模块7.14PO设计模式importunittest

#导入unittest模块,用于单元测试importddt

#导入ddt模块,用于数据驱动测试

@ddt.ddt

#应用ddt装饰器,使得类可以进行数据驱动测试classTest_login1(myunit.StarEnd):

#继承自myunit模块中的StarEnd类7.14PO设计模式

#测试方法1,测试登录和添加操作,并验证成功消息

deftest01(self):

data=function.get_csv(2)

#从CSV文件中获取第2行的数据

test_login(self.driver,data[0],data[1])

#执行登录操作

test_add(self.driver,data[2])

#执行添加操作

function.jietu(self.driver,"test01")

#截图并保存为test01.png

Po=AddPage(self.driver)

#创建AddPage对象

self.assertIn(Po.success_1(),data[3])

#验证成功消息是否包含在返回的文本中7.14PO设计模式

#测试方法2,测试登录和添加操作,并验证错误消息

deftest02(self):

data=function.get_csv(3)

#从CSV文件中获取第3行的数据

test_login(self.driver,data[0],data[1])

#执行登录操作

test_add(self.driver,data[2])

#执行添加操作

function.jietu(self.driver,"test02")

#截图并保存为test02.png

Po=AddPage(self.driver)

#创建AddPage对象

self.assertIn(Po.error_1(),data[3])

#验证错误消息是否包含在返回的文本中7.14PO设计模式

#测试方法3,测试登录和添加操作,并验证失败消息

deftest03(self):

data=function.get_csv(4)

#从CSV文件中获取第4行的数据

test_login(self.driver,data[0],data[1])

#执行登录操作

test_add(self.driver,data[2])

#执行添加操作

function.jietu(self.driver,"test03")

#截图并保存为tes

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论