当前位置: 首页 > 产品展示 > 数码模块

体育williamhill

PRODUCTS
×

william威廉希尔:软件测试案例|使用 pytest+selenium 进行UI自动化测试(源码+视频)

发布时间:2022-04-13 07:24:03 来源:william威廉希尔 作者:williamhill吧

  原标题:软件测试案例|使用 pytest+selenium 进行UI自动化测试(源码+视频)

  pytest是一个非常成熟的全功能的Python测试框架,编写用例格式简单,拥有比较丰富好用的插件,例如:pytest-html是完美的html测试报告生成插件;pytest-rerunfailures可以令失败case重复执行。通过本实验,可以基本了解pytest的基本使用。

  5.理解命令行执行参数的意义如 -s -v -m,理解测试结果符号代表的含义。

  8.当写了多个测试用例时候,可将测试用例分组:利用@pytest.mark.p0

  4. 模块(.py)文件中,定义函数名以 test_开头,编写至少3个测试用例。

  如果出现如图1所示的报错,这样一段话表示的是因为网络的问题超时,需要使用国内的镜像源来加速。可以按Ctrl+C退出,然后可以去淘宝,豆瓣等镜像找到资源进行下载,这里我使用的是豆瓣源。

  这里的-U就是--upgrade,意思是如果已安装就升级到最新版。运行后结果如图2所示,可以看到pytest由6.0.1升级到了最新的6.2.4。

  解压压缩包,找到chromedriver.exe放到chrome的安装目录(或者其他你希望的目录下)。复制chromedriver.exe文件的路径并加入到电脑的环境变量中去。进入环境变量编辑界面,添加到用户变量即可,双击PATH,将刚刚复制的路径添加到后面。我这里把它放在了python环境的根目录下,就不用再添加环境变量了。

  完成后在cmd下输入chromedriver验证是否安装成功,如图8所示。

  3)在项目根文件夹路径下开启cmd,输入命令:pytest,结果如下。pytest运行规则:查找当前目录及其子目录下以test_*.py或*_test.py文件,找到文件后,在文件中找到以test开头的函数并执行。运行结果如图11所示。

  这个 [100%] 指运行所有测试用例的总体进度。完成后,pytest会显示一个失败报告,因为func(3)不返回5。

  4)编写更多测试用例。前面是写的一个test开头的测试函数,当用例有多个的时候,写函数就不太合适了。这时可以把多个测试用例,写到一个测试类里,如图12所示。

  pytest会找到符合规则(test_.py和_test.py)所有测试,因此它会发现两个文件有test_前缀。我们现在只想运行其中一个,可以指定传递文件名test_class.py来运行模块,切换至子目录tests下后输入命令:pytest test_class.py,运行结果如图13所示。

  可以看到第一、三个测试通过,第二个测试失败。并且可以在断言中轻松查看失败的原因。

  5)可以看到我其实在test_class.py为测试类编写了主函数,这是cmd之外另一种运行测试用例的方式,即使用pytest.main([参数列表])方式。如图14所示,直接运行test_class.py即可。

  6)可以看到上面主函数的参数列表中除了要运行的文件,还有一个-q参数,如果改成-s,效果如图15所示。

  -q, --quiet和-s, --capture=method都是pytest的运行参数,-q是安静模式,不输出环境信息,只显示整体测试结果;-s 用于显示测试函数中print函数输出,因为默认情况下写在用例中的print或者log输出,都不会在测试结果中展示,如果想看到用例中的标准输出,那么需要加上-s参数。

  另外一些常见的运行参数有-v, --verbose用于显示更详细的、每个测试函数的执行结果;-m MARKEXPR,只能运行有相应标识的测试用例等等,-h, --help帮助,可以查询帮助信息,看到其他运行参数如何使用,如图16所示。

  注意,-m后面不能带’’(单引号),只能带“”(双引号),不然识别不到。

  首先在项目根目录创建一个文件,这是pytest 的配置文件;然后在pytest.ini文件的markers 中写入mark 标记,冒号“:”前面是标记名称,后面是mark标记的说明,可以是空字符串;注意pytest.ini 文件中只能使用纯英文字符。pytest.ini内容如图19所示。

  再次运行之前的指令,如图20所示,可以看到warning已经全都没有了。

  c) 如果要运行多个标识的话,可以按照-m “mark1 and not mark2”的格式用表达式。

  fixture的作用类似unittest中的setup和teardown,可以做测试前后的初始化设置,实现如测试数据准备,链接数据库,打开浏览器等这些操作;实现测试用例的前置条件;支持经典的xunit fixture,像unittest使用的setup和teardown;可以实现unittest不能实现的功能,比如测试用例之间传递参数和数据。

  调用fixture有三种方式,如上图就是fixture的名字直接作为测试用例的参数。

  这三种方式都可以使用fixture,但是只有第一种可以调用fixture的返回值,即如果测试用例需要使用fixture返回的参数必须要用第一种方法。

  -session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module,通常这个级别会结合conftest.py文件使用。

  conftest.py是一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置。配置时需要注意:conftest.py配置脚本名称是固定的,不能改名称;conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件;不需要import导入 conftest.py,pytest用例会自动查找。

  执行结果如图33所示,可以看到两个测试文件的测试用例执行前都执行了conftest.py文件中的login方法。

  5 driver.get方法将打开URL中填写的地址,WebDriver将等待,直到页面完全加载完毕(其实是等到“” 方法执行完毕),然后返回继续执行该脚本。值得注意的是,如果这个页面使用了大量的Ajax加载,WebDriver可能不知道什么时候页面已经完全加载,Waits可以解决这个问题。

  8-10 我发送了一个关键字,这个方法的作用类似于用键盘输入关键字。特殊的按键可以使用Keys类来输入,该类继承自on.keys,为了安全起见,先清除input输入框中的任何预填充的文本(例如:“Search”),从而避免搜索结果受影响。

  11 提交页面后,会得到所有的结果。为了确保某些特定的结果被找到,使用assert。

  12 最后,关闭浏览器窗口。还可以使用quit方法代替close方法,quit将关闭整个浏览器,而close只会关闭一个标签页,如果只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器。

  经验证以上程序可以正常运行,因为是对页面模拟一系列用户操作所以截图无法体现,会在视频中演示。

  可以正常运行,如图39所示;并且打印出report01.html测试报告,如图40所示。

  接下来,我尝试写一个GitHub的登录测试文件。在TestAutomation文件夹下新建并编写test_02.py,如图41所示。

  涉及到的用户行为是:打开GitHub登录页:;输入用户名、密码,点击Sign in;点击右上角小三角,在下拉框里点击Sign out。接下来我们用selenium来模拟这个行为,并用pytest测试功能。

  现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时,该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出ElementNotVisibleException异常。使用waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔,主要是定位元素或针对该元素的任何其他操作。

  Selenium Webdriver提供两种类型的waits -隐式和显式。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

  首先,选中输入框,右键选择“检查”,即审查元素,Chrome浏览器会自动打开控制台并找到在源码中找到该元素的位置,设置高亮,如图42所示。

  根据这些信息,来定位这个元素。在一个页面中有很多不同的策略可以定位一个元素,这里选择用根据id查找的方式。找到这个元素后,调用send_keys方法,输入用户名。

  14 检查结果。登录完成之后,需要检查是否登录成功,这里就需要有个检查点,我选择检验该页面的账户名是不是我刚才登录的这个账号。通过在控制台查阅源码,如图45所示,发现这一行有用户名信息,我选择用Xpath方法定位这个元素。

  XPath是XML文档中查找结点的语法。因为HTML文档也可以被转换成XML(XHTML)文档,Selenium的用户可以利用这种强大的语言在web应用中查找元素。XPath扩展了(当然也支持)这种通过id或name属性获取元素的简单方式,同时也开辟了各种新的可能性,例如获取页面上的第三个复选框。

  使用XPath的主要原因之一就是当你想获取一个既没有id属性也没有name属性的元素时, 你可以通过XPath使用元素的绝对位置来获取他(这是不推荐的),或相对于有一个id或name属性的元素(理论上的父元素)的位置来获取你想要的元素。XPath定位器也可以通过非id和name属性查找元素。

  绝对的XPath是所有元素都从根元素的位置(HTML)开始定位,只要应用中有轻微的调整,会就导致定位失败。但是通过就近的包含id或者name属性的元素出发定位你的元素,这样相对关系就很靠谱,因为这种位置关系很少改变,所以可以使测试更加强大。

  16-19 判断是否登陆成功。通过判断获取到的值与期望结果是否一致实现,符合预期结果测试通过;不符合预期结果测试不通过。

  21 测试完成,退出登录。先定位到右上角小三角,点击它获得下拉菜单。但是这一次审查元素定位到的位置是不准确的,如图46所示。

  本实验主要分为安装并配置环境、练习pytest基本使用、练习selenium基本使用、使用pytest和selenium实现UI自动化测试四个部分。其中,练习pytest基本使用完全覆盖了实验目的和实验要求。并在第四部分通过脚本语言,模拟用户行为操作,接近用户真实场景,实现对 web 自动测试,以自动化测试页的搜索功能,网页的登录功能为例进行了练习。通过本实验,我们基本了解了基于pytest和selenium的UI自动化测试的基本思路,熟悉了这两种测试工具的基本操作。

  本书较为全面、系统地阐述了当前软件测试领域的理论和实践知识,介绍了当前新的软件测试理论、标准、技术和工具。全书共三部分16章。第一部分(第1~7章)包括软件测试概述、软件测试模型、

  网上书店系统测试、生活小工具微服务测试和手机视频播放App测试。每章均有实际案例作为补充,以加深读者对软件测试技术和过程的理解,做到理论与实践相结合。

  相关专业软件测试相关课程的教材或教学参考书,也可供从事计算机应用开发的各类技术人员参考。

  本书配套资源丰富,包括教学大纲、教学课件、电子教案、习题答案、程序源码、在线题库,作者还为本书精心录制了微课视频。