My_Project

资料整理


WEB自动化-Python+Selenium+Unittest框架

<p>各个驱动下载地址: <a href="http://www.seleniumhq.org/download/">http://www.seleniumhq.org/download/</a></p> <h3><strong>一、PSU介绍</strong></h3> <p><strong>1.概念</strong> <strong>2.特点</strong> <strong>3.优点</strong></p> <pre><code>灵活,只要Python开发功底好,可以自由发挥(自动发邮件、定时任务...)</code></pre> <p><strong>4.缺点</strong></p> <pre><code>学习成本高,开发要考虑的问题测试写UI自动化也需要考虑,比如封装、设计模式等,什么都要自己来,如果你想生成HTML格式的报告,还需要去找HTMLReport这样扩展</code></pre> <h3><strong>二、测试流程</strong></h3> <pre><code>规划-&gt;搭建环境-&gt;编写并调试脚本(核心:元素定位)-&gt;工程维护优化</code></pre> <p><strong>1.规划</strong></p> <pre><code>1.1确定测试范围,根据功能用例整理自动化测试用例 1.2分工 1.3确定具体进度时间相关的情况 1.4确定自动化的框架,资源,环境搭建等</code></pre> <p><strong>2.框架</strong></p> <pre><code>python+selenium+unittest框架(PSU)</code></pre> <p><strong>3.<a href="https://www.showdoc.cc/lkr?page_id=3767718196953191" title="环境">环境</a></strong></p> <pre><code>https://www.showdoc.cc/lkr?page_id=3767718196953191</code></pre> <p><strong>4.编写并调试脚本</strong></p> <p>4.1 创建工程</p> <pre><code>4.1.1 将unittest与selenium融合在一起进行web自动化测试 创建Commonlib目录存放公共模块(我们封装的selenium模块) 创建Business目录存放根据业务创建测试功能模块(测试用例的每一个步骤) 创建Testcase目录存放测试用例 创建Testdata目录存放测试数据 4.1.2说明: unittest.main()运行时,框架自动寻找TestCase子类,并且运行 在TestCase类中,只把以test开头的方法当做测试用例,然后执行 setUp()用于初始化一些参数,在测试用例执行前自动被调用 tearDown()用于清理,在测试用例执行后被调用</code></pre> <p>4.2编写并调试脚本</p> <p>元素定位:<a href="https://www.showdoc.cc/lkr?page_id=3777281209607722">https://www.showdoc.cc/lkr?page_id=3777281209607722</a></p> <pre><code>4.2.1 说明:重点是元素的定位 备注:运行的两种形式 unitest.main() unittest.TexttestRunner(veribosity=2).run(测试套件)</code></pre> <p>4.3断言</p> <pre><code>4.3.1 说明 断言是测试用例的核心,经常使用assertEqual(value1,value2)来判断预期结果,用assertTrue()和assertFalse来做是非判断 4.3.2 断言方法以及匹配方式 主要是通过响应的状态码、提示信息、响应的正文内容来断言的;响应的状态码比如说常见的有200、302等;提示信息比如说常见的有OK、Found等;响应正文内容,具体要根据项目实际情况去定(比如说错误码、提示信息、或者是其他的内容)等 断言步骤: 一、先获取响应数据 r = requests.get (url= url,params= params, headers=headers) r = requests.post (url= url,data=params,headers=headers) 二、提取响应数据里面的信息 状态码 //r.status_code //200 提示信息 //r.reason //OK 响应的正文内容 //r.text //HTML网页 //r.json() //文本 //r.content //字节方式,需进行解码,二进制的信息流 三、断言 1、断言 '状态码/响应码' self.assertEqual(res.status_code,200) 2、断言 '响应信息' self.assertEqual(res.reason,'OK') 3、断言 '正文内容' //主要:错误码,提示信息,其他内容 self.assertEqual(res.JSON()['info'],self.assert_info) self.assertIn(self.assert_info,r.text) substring(x.y) //从x到y前的位置停止 4、断言 '数据库'</code></pre> <p>4.4报告 HTMLReport测试报告:<a href="https://www.showdoc.cc/lkr?page_id=3777309391277107">https://www.showdoc.cc/lkr?page_id=3777309391277107</a></p> <pre><code>4.4.1 引用HTMLReport测试报告 4.4.1日志&amp;报告默认保存路径自己设置 4.4.3报告常见问题 Error:一般是代码问题 Fail:测试不通过(BUG)或断言有问题 PASS:测试通过</code></pre> <p><strong>5.工程的管理维护与优化</strong></p> <pre><code>5.1参数化:数据与脚本分离,方便后期传参。 5.1.1固定的常量数据,一般通过定义为全局变量的方式,通过paramunittest以参数的形式传递到脚本中 5.1.2输入的测试数据,一般保存在excel文件中,导入excelLibrary库读取数据,然后封装操作excel文件的用户关键字,对数据进行读取并通过paramunittest以参数的形式传递到脚本中(这里需要用到第三方测试库 ExcelLibrary) 5.2模块化:把常用的'功能业务'封装成模块\函数,方便后期调用。 5.2.1把常用的'业务功能'进行封装,封装成用户关键字,以便在其他的业务流程中重复调用;一般的操作方法是:定义资源-&gt;将用户关键字放入资源中(如果需要用到我们封装的用户关键字,需要在对应的测试套件中导入资源) 5.2.2常见的模块有: 用例模块:利用unittest框架来管理各个业务功能模块的用例 公共方法模块:读excel操作、连接访问数据库的操作、业务功能的封装 报告模块 配置文件模块 总程序入口模块 5.3管理用例:unittest框架 5.3.1 unittest框架可以自动帮我们去加载/管理用例并运行用例</code></pre> <h3><strong>三、selenium框架</strong></h3> <p><strong>1.概念</strong></p> <pre><code>是一个用于WEB应用程序测试的工具</code></pre> <p><strong>2.特点</strong></p> <pre><code>2.1 它采用Javascript单元测试工具JSUnit为核心,只要在测试用例中把预期的用户行为与结果都描述出来,我们就得到了一个可以自动化运行的功能测试套件 2.2 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样</code></pre> <p><strong>3.原理</strong></p> <pre><code>简单介绍一下WEBdriver的工作原理: 启动浏览器后,selenium-WEBdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为WEBdriver的远程服务器。 客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The WEBDriver Wire Protocol,在HTTP request的Body中,会以WEBDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。 服务端需要依赖原生的浏览器组件,转化WEB Service的命令为浏览器native的调用来完成操作。 注: the WEBDriver Wire Protocol是Selenium自己设计定义的协议,这套协议非常强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等。 WEBDriver Wire协议是通用的,也就是说不管FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的WEB Service。 例如:FirefoxDriver初始化成功,默认从HTTP://localhost:7055开始,IE则是从HTTP://localhost:52432开始</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/79287e4376a96ffd3d6c104fe2fdd9d6?showdoc=.jpg" alt="" /></p> <p><strong>4.优点</strong></p> <pre><code>免费开源(源代码开放可以根据需要来增加工具的某些功能);支持移动测试;广泛的支持语言(JAVA,PYTHON,C等),平台和浏览器;庞大的社区; 大型插件库(可以实现类似商业工具的大部分功能,因为开源,可实现定制功能);核心功能(可以在多个浏览器上进行自动化测试)</code></pre> <p><strong>5.缺点</strong></p> <pre><code>没有内置的图像比较;没有技术支持;没有报告功能。</code></pre> <p><strong>6.selenium家族史</strong></p> <p>6.1 selenium1.0</p> <pre><code>6.1.1 selenium DIE 1、是一个Friofox插件,用于记录和播放用户与浏览器的交互,生成测试用例; 2、测试用例在Friofox浏览器里回放; 3、测试用例可以转换成其他语言的自动化脚本; 6.1.2 selenium Grld 1、允许selenium-RC针对规模庞大的测试案例集或需要在不同环境中运行的测试案例集进行拓展 6.1.3 selenium RC 1、RC是remote control的缩写,它的功能就是用来模拟一个浏览器,主要测试的就是WEB方面; 2、支持多种平台、多种浏览器、多种语言编写测试用例 6.1.4 缺陷 1、不支持本机键盘和鼠标事件; 2、不支持同源策略XSS/HTTP(S); 3、不支持弹出框,对话框(基本身份证,自签名的证书、文件上传/下载);</code></pre> <p>6.2 selenium2.0</p> <pre><code>6.2.1 selenium2.0=selenium1.0+WebDriver; 6.2.2 基于调用WebDriver Api 来模拟用户操作(元素定位); 6.2.3 WebDriver的速度更快,因为它直接交互使用; 6.2.4 支持更多编程语言</code></pre> <p>6.3 selenium3.0</p> <pre><code>6.3.1 去掉了对selenium rc的支持 6.3.2 全面拥抱java8 6.3.3 支持macOS,支持官方的safardriver 6.3.4 通过ms官方的webderver server支持Edge浏览器 6.3.5 支持ie9.0版本以上 6.3.6 通过Mozliia官方的geckdriver来支持firefox</code></pre> <p>6.4 selenium RC与selenium WebDriver区别</p> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/1a0ea70e214a0b91b1c1d15456bf3391?showdoc=.jpg" alt="" /></p> <p><strong>7.WEB自动化关注重点</strong></p> <pre><code>说明:做WEB自动化重点关注的是Selenium IDE 和Selenium2.0(WebDriver)</code></pre> <p>7.1 Selenium IDE(重点关注录制脚本) <a href="https://www.showdoc.cc/lkr?page_id=3782067038183794">https://www.showdoc.cc/lkr?page_id=3782067038183794</a></p> <p>7.2 Selenium2.0(WebDriver)(重点关注元素定位) <a href="https://www.showdoc.cc/lkr?page_id=3777281209607722">https://www.showdoc.cc/lkr?page_id=3777281209607722</a></p> <p><strong>8.selenium自动化框架</strong></p> <pre><code>概念: 其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。 目的: 1)自己从头实现太复杂; 2)使用框架能够更专注于业务逻辑,加快开发速度; 3)框架的使用能够处理更多细节问题; 4)使用人数多,稳定性,扩展性好;</code></pre> <p><strong>9.selenium基于Python环境搭建</strong></p> <p>9.1 步骤</p> <pre><code>1. Windows系统(在这里我们以Windows10为案例) 2. Python 3.5(以上版本) 3. 安装selenium2包 4. 浏览器+相应驱动 5. 安装PyCharm(java开发的,需要安装JDK)</code></pre> <p>9.2 Python2种环境</p> <pre><code>1、安装工具箱:已经写好的原有自带的封装好的常用的命令指令等(OS,time等); 2、安装解释\编译器:相当于视频的播放器功能;java是编译器;pycharm是解释器; 注: 是解释器还是编译器完全取决于开发语言的类型。</code></pre> <p>9.3 selenium 安装、卸载、查看命令</p> <pre><code>说明:在安装selenium时,前提是Python3.5以上版本安装完毕且能正常运行 安装:pip install selenium==2.48.0 1). pip:通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。 2). install: 安装命令 3). selenium==2.48.0: 指定安装selenium2.48.0版本(如果不指定版本默认为最新版本) 卸载:pip uninstall selenium 查看:pip show selenium</code></pre> <p>9.4 浏览器</p> <pre><code>9.4.1 火狐浏览器【推荐】 1. FireFox 48以上版本 Selenium 3.X +FireFox驱动——geckodriver 2. Firefox 48以下版本 Selenium2.X 内置驱动(48版本以下不需要下载安装驱动;V35兼容性最好) 9.4.2 谷歌浏览器 selenium2.x/3.x +Chrome驱动 9.4.3 IE浏览器【了解】 1. IE 9以上版本 Selenium3.X +IE驱动 2. IE 9以下版本 Selenium2.X +IE驱动 9.4.4 驱动下载 各个驱动下载地址: http://www.seleniumhq.org/download/ 1. 浏览器的版本和驱动版本要一致!(如果是32bit浏览器而Driver是64bit则会导致脚本运行失败!) ; 2. 浏览器驱动下载好后需要添加Path环境变量中,或者直接放到Python安装目录,因为Python以添加到Pa th中 ; 3. 推荐使用火狐浏览器(24、35)版;</code></pre> <p><strong>10.Selenium API基础</strong> <a href="https://www.showdoc.cc/lkr?page_id=3782088071497617">https://www.showdoc.cc/lkr?page_id=3782088071497617</a></p> <p><strong>11.Selenium API高级</strong> <a href="https://www.showdoc.cc/lkr?page_id=3783800496075967">https://www.showdoc.cc/lkr?page_id=3783800496075967</a></p> <h3><strong>四、unittest模块</strong></h3> <p>1.基本概念</p> <pre><code>Unittest单元测试框架是专门用来进行测试的框架</code></pre> <p>2.基本用法</p> <pre><code>2.1 通过继承unittest.TestCase进行编写,继承unittest.TestCase的类会被框架识别为测试用例 2.2 setUp和TearDown是用于事前和事后做相关处理动作的,就是前面说的Test Fixture,会在每个测试用例运行前后被框架自动调用 2.3 所有以test开头的方法会被框架自动识别为测试用例,并自动调用执行,不是以test开头的不会被调用 2.4 unittest.main()是最简单的测试执行方式 2.5 调用unittest.main()方法后,继承自unittest.TestCase类的类会被自动识别为测试用例并且被调用</code></pre> <p>3.unittest断言</p> <pre><code>详见测试流程-4.3断言</code></pre> <p>4.unittest命令行接口</p> <pre><code>unittest支持命令行接口,我们可以在命令行里指定运行具体的测试用例。 python -m unittest test.Tese1</code></pre> <p>5.Unittest框架的几个方法&amp;执行顺序</p> <pre><code>5.1.1 Unittest框架的3个方法 def setup(self): pass def test_用例(self): pass def teardown(self): pass 5.1.2 Unittest框架的3个方法的执行顺序 先执行setup--&gt;test_用例1--&gt;teardown;再执行setup--&gt;test_用例2--&gt;teardown;有多少个用例,就执行多少次setup和teardown</code></pre> <p>6.Unittest框架-4个基本组件</p> <p>6.1Unittest框架基本组件1——test fixture测试固件:setUp、tearDown</p> <pre><code>说明:代表了用例执行前的准备工作和用例执行之后的清理工作 setUp //测试用例运行前被框架调用 tearDown //测试用例运行后被框架调用 def setUp(self): """ 功能:初始化工作 :return: """ #打开浏览器 self.driver = open_browser(browser_type) #输入url self.driver.get(url) #打开excel文件 self.infofile = open_excel(filename) time.sleep(1) def test_001(self): """ 功能:用例1 :return: """ #操作:元素定位、输入、点击 #断言:判断登录前后提示信息是否一致 def test_002(self): """ 功能:用例2 :return: """ #操作:元素定位、输入、点击 #断言:判断登录前后提示信息是否一致 def tearDown(self): """ 功能:收尾清理工作 :return: """ self.driver.close()</code></pre> <p>6.2Unittest框架框架基本组件2——test case测试用例:test_模块1、test_模块2</p> <pre><code>说明: 主要用于继承,测试用例,是测试的最小单位,一般检查一组输入的响应(输出)是否符合预期,unittest模块提供了TestCase类来帮助我们创建测试用例 定义一个类Login,继承unittest里的TestCase类(TestCase类是测试用例类) unittest.main() //测试用例会被自动调用 class Login(unittest.TestCase): def setUp(self): pass def test_001(self): pass def test_002(self): pass def tearDown(self): pass if __name__=='__main__': unittest.main()</code></pre> <p>6.3Unittest框架框架基本组件3——Test suit:测试套件</p> <pre><code>说明: 测试套件,是测试用例或测试套件的集合,一般用来把需要一起执行的用例组合到一起;将测试用例装入,在runner中被调用 suite = unittest.defaultTestLoader.discover(TEST_CASE, pattern='test*py') 加载器:defaultTestLoader 加载用例:discover //discover(TEST_CASE,pattern='test*py'):加载TEST_CASE目录下所有以test开头的文件到套件中</code></pre> <p>6.4Unittest框架框架基本组件4——test runner:加载器&amp;执行器</p> <pre><code>说明: 用来执行测试用例并输出测试结果的组件,可以是图形界面或命令行界面 创建执行器:TestRunner 执行用例:runner.run(suite) //创建执行器TestRunner runner = HTMLReport.TestRunner( //报告文件名,如果未赋值,将采用“test+时间戳”; report_file_name='Testcase', //保存文件夹名,默认“report”; output_path='Testcase', //保存文件夹名,默认“report”; output_path='report', //报告标题,默认“测试报告”; title='KR自动化测试报告', //报告描述,默认“测试描述”; description='KR自动化测试报告描述', //并发线程数量(无序执行测试),默认数量 1; thread_count=1, //各线程启动延迟,默认0s; thread_start_wait=3, //是否按照套件添加(addTests)顺序执行; //会等待一个addTests执行完成,再执行下一个,默认False; //如果用例中存在 tearDownClass ,建议设置为True; //否则tearDownClass 将会在所有用例线程执行完后才会执行; sequential_execution=False, # 支持中文与英文,默认中文; # lang='en' lang='cn' ) //执行用例 runner.run(suite)</code></pre> <p>7.Unittest框架批量执行用例步骤</p> <pre><code>//创建一个测试套件 //将用例加入测试套件 suite = unittest.defaultTestLoader.discover(testcaseFile,pattern='test*.py') //创建一个执行器 runner = unittest.TextTestRunner() //执行用例 runner.run(suite)</code></pre>

页面列表

ITEM_HTML