一、自动化测试
1、你做过自动化测试?做过,ui自动化测试、接口自动化测试、app自动化测试
2、你讲下你是如何做的ui自动化?
(1)按线性脚本讲解:python+selenium做的ui自动化测试
(2) 按unittest 框架: python+selenium+unittest框架做自动化
(3)po框架实现ui自动化
二、自动化编写的规则
1、熟悉的自动化场景写,不熟悉不写
2、有开始、有结束、连接数据删除,增加、校验
3、结合自己的项目梳理自动化场景
4、讲解的流程:
拿最近这个来说下:xx保险,我讲一个投保流程,首先导入。。。。。
三、讲解案例
第一种:python+selenium讲解(结合业务讲解)
案例1:
我做自动化是用python+selenium做的;讲些xx保险中的注册,登录,投保的流程;首先导入selenium模块:from selenium import webdriver ,在创建一个driver对象=webdriver.浏览器(谷歌或ie),通过driver.get 打开xx保险官网,让浏览器最大化driver.maxmize_window ,设置时间等待导入time模块 sleep(2);在页面中找注册按钮,f12查看元素属性(id、name、class、xpath、css等),确定元素属性driver.find_element_by_id( 值).click,因为是按钮点击,查看到注册界面,在去填写注册信息:姓名,手机号、学历(下拉框),点击提交,显示提交成功;import pymysql 连接数据创建游标,在使用sql语句查询是否注册成功;最后断开数据库连接dissmis.connest(),在关闭浏览器driver.quit()。这就是我做的自动化
案例2:
做ui自动化用的python+selenium库。 先导入selemiun中webdriver模块和time库中sleep模块。 我做自动化都是用的chrome浏览器或(ie、火狐等),然后下载对应驱动,创建对象driver=webdriver.chrome()调用驱动,通过对象driver去操作,通过用driver.get方法打开项目首页,在将浏览器最大化maximize_window,最大化是为了防止有些元素加载不完全或者点击不到。然后我会用一个implicitly_wait隐式等待方法,因为网速追不上程序的运行速度。如果是页面不跳转在页面加载元素的话,我会选择再用个sleep方法强制等待2S左右,因为不跳转的时候implictly wait不会生效,如果需要定位这些元素就会定位不到。 进入后先登录,通过link_text定位登录这个链接元素,用click点击,然后定位用户名输入框和密码输入框,用send_keys传入账户名和密码,然后用xpath定位确认登录按钮用click点击,登录就完成了。这个时候回跳转至首页。 项目首页就有投资模块的入口,用find_element_by_link__text找到元素然后用click点击,这个时候页面会跳转,跳转完是进入标的搜索页面,选择标的类型:正常的标投资或者债权转让,标的时间,我们项目是1月,2月,12个月,标的类型是用click就可以点击实现了,时间选择我们是个下拉框,需要先导入select模块,然后先select接这个元素,然后用select by index方法,选择1个对应的值。这里说明下我为什么用index,因为有时候会换中英文,或者value值,会导致脚本失败,而index就可以避免这种情况了。选择完这两个后等待元素的加载,这里也是用sleep,选择某一个标的投资按钮,也是用xpath定位然后click点击,这个时候页面新开一个确认投资窗口,这个时候就涉及到页面的切换,这里涉及到一个利用句柄handle切换窗口,先使用browser.window_handles获取所有句柄,索引位-1就是最新的窗口的,用switch_to_window()接新窗口的句柄就可以切换窗口了。然后用send_keys传入投资金额,支付密码,然后验证码是让开发同事写成了固定的字符,短信验证码关闭了。然后点击确认投资换这个button,也是用xptah定位,click点击。这个时候页面会跳转显示投资成功,这里我会用投资完成这个文本来做断言,用的是if not 加上assert false做的。然后就关闭浏览器用quit。然后前台的操作就完成了,再进入数据库校验数据,这里需要导入pymysql模块,然后用connect连接项目的数据库,用cursor获取游标,(游标就是一个数据的缓存区,用execute方法就可以吧sql语句取出来的临时表放入游标中,fetchall就可以把游标内的数据都是放在toupl容器中,通过索引位就可以把真实数据取出来做断言了)用execute接sql语句来获取对应的投资者在此项目的投资金额,在用fetchall取出此数据,断言这个数据是否等于我们在前台输入的投资金额。然后就断开数据库链接,关闭浏览器。这就是我的大概流程了。
案例3:
导入selenium==选择浏览器==创建对象====通过对象get打开浏览器====窗口最大化====时间等待(三种)====业务场景(id、name、class、css、xpath、link_txt、js方法)===比如一些控件(farm框、弹框、按钮、切换窗口、点击、输入)==断言(通过title、text)====连接数据库区校验正确性
案例4:
用的是python+selenium来做的,那我大概和您讲一下我做ui自动化的流程吧
答:首先的话就是我需要打开pycharm然后新建一个py模块,然后导入selenium模块,time模块等等,然后通过from selenium import webdriver语句导入webdriver模块,然后创建一个driver对象:driver=webdriver.Chrome(),再通过driver.get方法来打开我们测试环境的地址,再使用 driver.maximize_window()最大化浏览器窗口,然后会使用driver.implicitly_wait()设置一个隐式等待,我可以通过driver.find_element_by_id,或者xpath,name,class,css等元素定位方法来进行定位到用户名和密码输入框,并且通过调用send_keys进行输入用户名和密码,最后通过调用click方法进行登录,登录之后,有一些表单的填写页面(比如主要有姓名、证件信息、手机号码、常住地址、邮箱、紧急联系人等等),如果是输入框我依旧用send_keys,如果有一些下拉框我会导入Select类,通过select_by_value方法进行定位,如果有滑动的地方我也会用window.scrollTo()方法,设置变量为js,然后通过driver.execute_script()来调用js变量来达到滑动滚动条的目的,包括如果是有iframe弹框的话,我首先会通过switch_to.frame()进入到iframe弹框,然后再进行其他的操作,如果要退出iframe框的话,直接用switch_to.default_content()方法就可以了,最后写完整个一个流程之后,我还会通过调用text方法拿到某个元素的文本值赋值给到一个变量,然后通过assert方法把预期结果和实际结果进行一个断言,以上就是我做ui自动化的一个大致流程,但是这是我们最开始做ui自动化的方法,后面因为做的时间也比较久,用例也比较多,所以后续用了unttest框架,PO设计模式和分层对用例进行了一些封装;
======================================================
python+selenium+unttest框框架做自动化
案例1:
我做ui自动化是通过Python+selenium+Unittest进行自动化测试,框架能帮我们比较规范的、系统的管理和执行用例,也便于后续的维护。下面我讲解下这个框架,首先需要导入unittest这个模块import unttest,我们做自动化的话还需要导入selenium这个模块,以及一些相关的模块,比方说time模块,OS模块,HTMLTestRunner报告模块。把我们需要的模块都导入,在unittest里我们需要去定义一个类,定义类名可以根据项目名定义,继承unittset.testcase,一个testcase的实例就是一个用例,类里需要有类的开始:setupclass,以及类的结束:teardownclass,在整个框架中只运行一次,然后在定义方法开始setup、方法结束teardown ,在用例每次执行中都会运行一次;然后我们需要去定义我们的用例,test1,test2,注意一定要以test开头,顺序按照ascii码1-9,大写A-Z,小写a-z,写完用例以后,我们需要去调用它,我们以main作为unittest的入口,执行自动化用例我们主要有4种调用的方式
第一种用unittest.main()去运行所有用例
第二种是创建一个套件TestSuite(),然后用addtest去添加你要执行的用例,这种方法可以执行部分测试用例,
第三种就是搜索绝对路径去执行自动化,调用unittest.testloader().discover()去搜索路径下的用例,在通过unittest.TextTestRunner() .run()方法执行搜索到用例
第四种是生成测试报告,搜索绝对路径去执行自动化,调用unittest.testloader().discover()方法执行用例,然后把执行结果写入我们导入的html报告模板文件,执行之后就能看到我们路径下所有用例的执行结果。
以上就是unittest框架的整个基本流程
案例2:(结合项目讲解)
我说下电商下单自动化测试流程吧,因为是基于unittest框架进行编写所以需要用import unittest导入unittest模块还需要导入webdriver模块因为需要用webdriver方法去调用谷歌浏览器的驱动来打开浏览器,然后先定义一个类在参数中输入unittest.testcase用来继承unittest.testcase中的类,然后定义setup方法在setup中先将webdriver.Chrome赋值给self.变量chrome是我用的谷歌浏览器的驱动,并用login.dl(self.变量)来调用之前封装好的登录功能,然后再定义一个test打头的函数这里主要用于编写实际测试用例,然后在test函数中将slef.变量再次进行赋值给一个变量方便于操作。接下来进行定位搜索栏,输入商品名称,点击搜索按钮,用F12获取xpath值然后用find_element_By_xpath对搜索栏进行定位并赋值给一个变量这里这里说下为啥用xpath进行定位,因为有时候id 和name 等属性值不是唯一的或者没有,所以直接使用xpath进行定位会比较好能解决百分90的定位问题,然后使用send_keys()去进行输入操作和click()进行点击按钮操作,此时页面中会搜索出我搜索的商品,仍然通过xpath定位和click()操作搜索出的商品页面会新开窗口进入商品详情页,这时候就需要用window handles获取所有窗口的句柄并赋值给一个变量,然后使用switch to window加变量索引值切换到新窗口,有时候网页会加载比较慢所以需要使用from time import sleep导入时间模块然后使用sleep等待3秒,确保网页加载完成后进行下一步操作,然后在用find_element by xpath.click选择商品的规格型号和商品数量,接下来通过find_element_by_xpath.text获取商品详情页中我选择的规格型号、商品数量、商品单价、订单小计/合计,通过find_element_by_xpath.click点击立即购买按钮,页面进入到确认订单页,然后通过find_element_by_xpath.text获取确认订单页规格型号、商品数量、商品单价、订单小计/合计与商品详情页选择的数据使用if判断进行比较,如果一致就print 成功,否则else pirnt失败,确保订单中的数据是我在商品详情页中选择的数据,再接下来点击提交订单操作进行下单,下单后通过调用封装好的数据库读取模块传参(ip、user、pwdname/sql)进行访问数据库中order库获取我的订单数据,然后用order库中获取的数据与下单的数据进行if判断比较判断数据库中的订单数据是否正确,如果正确就print 成功,否则else pirnt失败,然后就是定义teardown方法在teardown中用close命令关闭浏览器,然后就是进行调用执行,执行方法有三种第一种unittest.main(),main的话就是执行了testloader类中的方法帮我们搜索test开头的用例并执行,执行顺序是按ascll码分布顺序运行的,第二种方法是用unittest.testsuit()方法,先将unittest.testsuit赋值给一个变量,然后通过这个变量使用addtest命令添加用例,在使用unittest.testrunner中的run方法执行这个变量。执行顺序的化是按照添加的顺序执行的。第三种方法是用unittest.default testloader.discover(加用例存放的路径,pattern等于模块名)再赋值给一个变量,然后同样通过unittest.testrunner中的run方法执行这个变量,然后为了查看执行详情结果所以需要写入执行报告。写入执行报告的话需要先导入一个HTMLtestrunnerCN 模块使用这个模块中 的htmltestrunner来写入执行报告并存放到指定的路径中
==============================================================================================================
案例1:我讲解下我的框架,po框架,
介绍po框架:page object model(pom模型)
优点:减少代码代码、提高测试用例的可维护性、可读性
业务代码和测试代码分开,降低耦合性,维护成本低
可以分成6层:如下
第1层是config配置层,这个里面主要是封装了一些我们测试环境的url地址等
第2层是data层,主要存放数据(包括url、账号、密码)
第3层是一个public包,分为两个包:pages包、utiles 工具类包
(1)pages要封装了元素定位的方法比如把id,name,class,xpath,css等等都封装在一个类方法里面了,还把一些send_keys和隐式等待和其他其他公共方法都进行了二次的封装
(2)utils工具类层,这个里面主要封装了一些读取Excel表格的工具类,还有发邮件的工具类,报告模板、
第4层就是testcase用例层,这个里面主要就是通过定义一个类然后继承unittest.TestCase这个类,通过unittest单元测试框架来管理用例,在setupclass里面去创建driver对象,然后通过设置和取值的方法,拿到driver对象,先编写登录的用例,然后这个里面也用到了PO设计模式,把我们的元素定位和流程层,代码层进行了分离,最后用例写完再通过self.assertEquals进行一个断言
第5层就是run运行层:首先会通过把所有的用例加载到一个suite套件里面,然后再通过调用run方法运行这个套件
第6层repotr报告层:通过HTMLtestrunner模块生成测试报告,然后最后通过Jenkins做可持续集成,在回归测试阶段,每天晚上都会运行一下我们的ui自动化用例;这就是po框架
案例2:
写自动化用例的时候我喜欢对用例进行分层处理。我一般会设置六个模块:公共模块、用例模块、执行模块、报告模块、数据模块、页面元素模块。
把一些公共的,经常调用的属性放到公共模块中,比如登录登退出啊,连接断开数据库等。
页面元素模块就是将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),这样的话当页面元素变动的话我们只需要更改页面元素对象即可。
把用例的具体内容放到用例模块中,比如我要借款,通过设置一些类,再把我要借款相应的用例放到这下面,这样后续我进行维护就非常的直观方便。
执行模块就是对上面各个类的执行方法,要执行哪些类里的哪些用例和对应测试报告的生成。
报告模块就是存放生成测试报告的地方,这样我们就能一目了然的看到是哪些模块下的用例的执行情况。
数据模块的是就是存放一些数据的地方,比方说用户的账户密码,网址信息等。
就拿我要出借这个流程的举个例子讲解一下吧!首先导入相应的库 from selenium import webdriver ,import unittest。然后新建一个继承unittest.testcase类。然后在def setup里写一些前置条件:像是webdrvier.chrome()选择谷歌浏览器,用get方式?获取网址打开,用maximize.window进行浏览器最大化处理,避免出现页面中元素定位后无法点击报错的现象,确保用例执行的准确性,因为有时候用例执行太快,而网页加载太慢会?导致报错,所以我一般都会用implicity_wait进行智能等待,确保页面加载完成。把登入写进了公共模块中直接调用他。
接下来定位我要出借,因为他是一个下拉列表,所以我们得先导入from selenium.webdriver.support.ui import Select模块,用 Select(dr.find_element_by_xpath(“ ”).select_by_index(1),通过索引位进行定位。这个时候会打开一个新页面,所以我们得定位到这个新页面。
首先我们先获取所以页面的句柄allhead=dr.window_handles,再用dr.switch_to_window(allhead[-1])定位到我要出借这个新页面,通过find_element_by_xpath定位对应的标,然后定位到投资金额框,至于输入金额的话为了提高效率,我是之前已经写好了随机生成整百金额的函数,所以我这边直接调用就可以了,至于验证码我之前就已经请开发帮我去掉了,然后定位确认投资按钮点击。接下来系统会弹出一个风险提示
揭示书,它是一个alter弹框,alter=driver.switch_to_alter()进入到alter弹框里,再用alter.accept()。
这时候为了保证用例执行的准确性,再用unittest框架中的断言,之后用if语句和assertEquals判断前后两个值是否相符如:(出借成功,出借失败),不相符的话用dr.get_screenshot_as_file("d:\\yy\\erorr1.png"),最后到执行和生成报告了,用unittest中的testloader方法。
定义一个变量接收测试用例的目录,discover=unittest.defaultTestLoader.discover(测试用例的目录,“text*.py”)加载该目录下所有以text开头。
的Py文件。
导入生成报告所需的HTMLTestRunnerCN模块,用with open打开对应的报告文件,“wb”二进制方式写入,用HTMLTestRunnerCN里的runner方法生成测试报告。最后用runnrt.run(discover)方法执行之前加 载的用例就好了。
这就是之前公司用python加selenium做自动化测试的一个基本流程。
==============================================================================================================
拓展pytest框架
==============================================================================================================
一、自动化测试中遇到过什么问题?
参考链接:https://www.cnblogs.com/xiaolehua/p/16642173.html
二、自动化测试面试题?
面试题如下:
1、你有做过自动化?你用什么语言? python
2、自动化中如何使用语言打开一个网址?浏览器,浏览器对应驱动,导入库,类,get,url
3、在一个浏览器中打开多个窗口?open_windows driver.execute_script
4、在自动化中如何释放资源? 当一个注意点,经验(不去quit,close)
5、如何切换窗口? switch_to_window(handle)
6、如何获取当前句柄?如何获取所有句柄?
7、如何获取当标题?如何获取所有标题?
8、如何在自动化输入文本?
9、如何点击按钮?
10、清除当前的内容的语句?
11、为什么使用时间等待?(使用时间的优点)
12、如何窗口最大化?
13、复选框如何多选或者全选?
14、单选框如何选择?
15、说一下自动化常用的定位方法? (9种)
16、下拉框如何定位?导入Select 类
17、iframe框如何定位?进入ifrme框的语句?ifrme退出框的语句?
18、弹框的定位?(确认型弹框,输入型弹框,alert弹框,)
19、自动化中本地文件上传?
20、如何定位滚动条?
三、自己整理自动化的知识点