lsekfe 发表于 2021-3-23 11:09:01

两种常用Selenium测试框架的对比

前言
  在使用Selenium过程中,目前比较流行的两种框架分别是Unittest和Pytest,之前一直使用Unittest框架,在查阅一些资料的时候发现大部分人在使用Pytest框架,心中不免产生疑惑这两种框架具体区别在什么地方呢,于是花半天时间整理一下具体的区别。
  下面以某软件登录功能为例查看一下具体区别:
http://www.51testing.com/attachments/2021/03/15326825_202103191005111Xm60.png

  功能实现用例
http://www.51testing.com/attachments/2021/03/15326825_202103191008131wq9D.png

  源文件:
  1.login.py

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

fromtime 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

fromtime 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

fromtime 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简单。

  上面仅仅是跑了两条用例,总结一下具体区别如下表:
http://www.51testing.com/attachments/2021/03/15326825_202103191011091ZrXu.png
页: [1]
查看完整版本: 两种常用Selenium测试框架的对比