• 13
  • 13
分享

  前言

  在使用Selenium过程中,目前比较流行的两种框架分别是Unittest和Pytest,之前一直使用Unittest框架,在查阅一些资料的时候发现大部分人在使用Pytest框架,心中不免产生疑惑这两种框架具体区别在什么地方呢,于是花半天时间整理一下具体的区别。

  下面以某软件登录功能为例查看一下具体区别:

1-1.png

  功能实现用例

1-2.png

  源文件:

  1.login.py

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from  time import sleep
from selenium import webdriver
class TestUserLogin(object):
    def __init__(self):
        self.driver=webdriver.Chrome()
        self.driver.get('http://localhost:8888/jpress/user/login')
        self.driver.maximize_window()
    #登录失败-用户名、密码错误
    def test_user_logon_username_error(self):
        username=''
        pwd='123456'
        expected='账号不能为空'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
#显示等待弹窗出现
        WebDriverWait(self.driver,5).until(EC.alert_is_present())
        alert=self.driver.switch_to.alert
        sleep(3)
        assert alert.text==expected
        alert.accept()
        #self.driver.quit()
#登录成功
    def test_user_logon_username_pass(self):
        username='wx1'
        pwd='123456'
        expected='用户中心'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').clear()
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
        WebDriverWait(self.driver,5).until(EC.title_is(expected))
        sleep(3)
        assert self.driver.title==expected
        self.driver.quit()

   

  2.main.py

from test_user_login import *
if __name__ == '__main__':
    case=TestUserLogin()
    case.test_user_logon_username_error()
    case.test_user_logon_username_pass()

   

  用例重构

  1.unnitest

  步骤:

  –拷贝之前写好的用例

  –更改继承类为unnitest.Testcase

  –修改init方法为setup

  –assert断言改为unittest断言

  –关闭浏览器teardown

  注意:清空数据、测试添加序号

  代码:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from  time import sleep
import unittest
from selenium import webdriver
class TestUserLogin(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver=webdriver.Chrome()
        cls.driver.get('http://localhost:8888/jpress/user/login')
        cls.driver.maximize_window()
    # def __init__(self):
    #     self.driver=webdriver.Chrome()
    #     self.driver.get('http://localhost:8888/jpress/user/login')
    #     self.driver.maximize_window()
    #用户名、密码错误
    def test_user_logon_username_error(self):
        username=''
        pwd='123456'
        expected='账号不能为空'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
        WebDriverWait(self.driver,5).until(EC.alert_is_present())
        alert=self.driver.switch_to.alert
        sleep(3)
        #assert alert.text==expected
        self.assertEqual(alert.text,expected)
        alert.accept()
        #self.driver.quit()
    def test_user_logon_username_pass(self):
        username='wx1'
        pwd='123456'
        expected='用户中心'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').clear()
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
        WebDriverWait(self.driver,5).until(EC.title_is(expected))
        sleep(3)
        assert self.driver.title==expected
        self.driver.quit()
if __name__ == '__main__':
    unittest.main()

   

  2.pytest

  重构过程

  步骤:

  –修改继承类为object

  –修改pytest setup方法:setup_class

  –修改python断言assert

  –使用pytest插件

  –pip install pytest-dependency

  代码:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from  time import sleep
from selenium import webdriver
import pytest
class TestUserLogin(object):
    def setup_class(self):
        self.driver=webdriver.Chrome()
        self.driver.get('http://localhost:8888/jpress/user/login')
        self.driver.maximize_window()
    #用户名、密码错误
    def test_user_logon_username_error(self):
        username=''
        pwd='123456'
        expected='账号不能为空'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
        WebDriverWait(self.driver,5).until(EC.alert_is_present())
        alert=self.driver.switch_to.alert
        sleep(3)
        assert alert.text==expected
        alert.accept()
        #self.driver.quit()
    def test_user_logon_username_pass(self):
        username='wx1'
        pwd='123456'
        expected='用户中心'
        self.driver.find_element_by_name('user').send_keys(username)
        self.driver.find_element_by_name('pwd').clear()
        self.driver.find_element_by_name('pwd').send_keys(pwd)
        self.driver.find_element_by_class_name('btn').click()
        WebDriverWait(self.driver,5).until(EC.title_is(expected))
        sleep(3)
        assert self.driver.title==expected
        self.driver.quit()
if __name__ == '__main__':
    pytest.main()

   

  运行完上面的代码之后我们可以发现,从初级脚本到pytest改写只需要修改pytest setup方法为setup_class(),如果需要函数依赖再安装一个dependency插件即可,较unittest简单。

  上面仅仅是跑了两条用例,总结一下具体区别如下表:

1-3.png


作者:桃子   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   《华尔街日报》1月10日消息,MetaPlatforms将不再让广告客户根据性别在Facebook和Instagram上针对青少年投放定向广告,这是旨在收紧该公司针对年轻用户广告政策的更广泛改革的一部分。  该公司在周二的一篇博文中说,Facebook和Instagram上的用户活动也将不再被用来针对青少年投放定向广告。该社交媒体公司表示,例如,对某些Instagram帖子或Facebook页面的参与度将不再决定青少年将看到的广告类型。  Meta表示,年龄和位置将是Facebook或Instagram向年轻人展示广告时使用的唯二信息。作者:佚名原文链接:新浪科技_新浪网(sina.com...
            0 0 802
            分享
          • DevOps 方法继续加强其在软件开发中的地位。所谓的连续工具是该领域最常用的工具之一。持续集成和持续交付等实践能够在进行任何更改后立即将代码交付到生产环境中。当使用更小改动的代码块时,将会让新功能发布和修复BUG并行成为可能。软件开发的 CI/CD 方法为产品迭代带来了更高的可靠性和更快的更新速度。CI 是 CI/CD 技术的第一阶段。在项目中实施持续集成有很多好处。它是软件更新的一个基本过程,其主要功能是将来自不同开发人员的代码更改集成到一个仓库中。今天我们将重点介绍 CI/CD 的第二阶段,持续交付。它有助于确保代码已准备好交付。它的主要特点是代码构建、测试和交付等过程的自动化,有助于及...
            1 0 914
            分享
          •   微信 Andoid 6.5.10 开始,微信官方提供了 Trace 导出工具,开发者可以在开发者工具 Trace Panel 中使用该功能。  1、安装 adb 工具  安装 brew:  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"   安装完成验证: brew --version  安装 adb: brew cask install android-platform-tools  运行ad...
            0 0 2091
            分享
          •   特斯拉正式发布了新近改款的 Model 3 轿车的性能版车型,以应对不断下滑的需求。新版 Model 3 的起价为 52990 美元,配备了新的主动减震系统和自适应悬挂系统,具有更好的操控性和舒适性,电池续航里程为 296 英里(约合476.36公里),从 0 加速到每小时 60 英里只需 2.9 秒,最大功率为 510 马力。  与之前的 Model 3 Performance 相比,新版本的峰值功率增加了 32%,峰值扭矩增加了 16%,阻力减少了 5%。特斯拉表示,与上一代车型相比,新款车型的能耗更低。这部分归功于新一代驱动装置以及后扩散器和扰流板。该车的前端和后端也进行了小幅整容,...
            0 0 530
            分享
          • 跨浏览器测试是一种测试,需要大量的精力和时间。通过不同的浏览器,操作系统,设备,屏幕分辨率测试Web应用程序,以评估针对各种受众的Web内容呈现的过程是一项活动。特别是如果手动处理。使用Selenium进行的自动跨浏览器测试可以帮助您节省例行测试活动的时间,并帮助您缩短回归测试的时间。但是,人们很少喜欢变化。如果手动测试在您的组织中很流行,那么当您要求他们实施测试自动化时,管理层显然会提出问题。测试自动化虽然非常有益,但通常可能会证明是昂贵的,但值得吗?在说服高层管理人员的同时,您可能会发现这是一个难题。在开发Web应用程序时,将需要您提供使用Selenium进行测试自动化的有效ROI,并通过...
            0 2 2353
            分享
      • 51testing软件测试圈微信