[测试] selenium自动化测试2

1.unittest框架

unittest是一个python版本的junit,junit是java中的单元测试框架

UI 功能单元测试

该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果

(1)测试固件(框架里面的固定方法)

setup 方法,测试环境和数据的准备工作

tearDown 做测试用例执行完之后的清理工作

(2)测试用例

一个用例是一个方法 ,def 名字以test_ 开头

(3)测试套件

把测试用例组织到一起进行一个整体的测试

必须以继承的方式来使用,Python也是一种面向对象的语言

from selenium import webdriver
import unittest
import time
import os
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import NoSuchElementException

class Baidu1(unittest.TestCase):
#     测试固件
    def setUp(self):
        print("-----setUp-----")
        self.driver = webdriver.Chrome()
        self.url = "https://www.baidu.com/"
        self.driver.maximize_window()
        time.sleep(3)

    def tearDown(self):
        print("-----tearDown-----")
        self.driver.quit()
#     测试用例
#     忽略测试用例的执行
#     @unittest.skip("skipping")
    def test_hao(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        driver.find_element_by_link_text("hao123").click()
        time.sleep(6)

    def test_hbaidu(self):
        driver = self.driver
        url = self.url
        driver.get(url)
        # self.assertEqual("突如其来的假期_百度搜索", driver.title, msg="实际结果和预期结果不一致" )
        self.assertTrue("百度一下,你就知道" == driver.title, msg="不一致!!!")
        driver.find_element_by_id("kw").send_keys("突如其来的假期")
        driver.find_element_by_id("su").submit()
        time.sleep(5)
        print(driver.title)
        # self.assertEqual(driver.title, "突如其来的假期_百度搜索", msg="实际结果和预期结果不一致" )
        time.sleep(6)

    def saveScreenAsPhoto(self, driver, file_name):
        if not os.path.exists("./image"):
            os.makedirs("./image")
        now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
        driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
        time.sleep(3)

    if __name__ == "__main__":
        unittest.main()

2.测试套件

(1)unittest.TestSuite

addTest(脚本名称.类名称.方法名) 一个方法一个方法的添加

makesuit:

unittest.makeSuite(脚本名称.类名称)可以把一个类中所有的测试方法添加到测试套件中

TestLoader:

unittest.TestLoader().loadTestsFromTestCase 把一个类中所有的测试方法创建成一个测试套件返回

(2)把一个文件夹下所有测试脚本的测试用例都执行一遍

discover

import unittest
from src20211230 import testbaidu2
from src20211230 import testbaidu1

def creatSuit():
    # 要把不同的测试脚本的类中的需要执行的方法放在一个测试套件中
    # suit = unittest.TestSuite()
    # suit.addTest(testbaidu1.Baidu1("test_hao"))
    # suit.addTest(testbaidu2.Baidu2("test_hao"))
    # suit.addTest(testbaidu2.Baidu2("test_haidusearch"))
    # return suit

   #如果我需要把一个测试脚本中年所有的测试用例都添加到suit中,怎么做?
   # makeSuit
   #  suit = unittest.TestSuite()
   #  suit.addTest(unittest.makeSuite(testbaidu1.Baidu1))
   #  suit.addTest(unittest.makeSuite(testbaidu2.Baidu2))
   #  return suit
#     TestLoader
#     suit1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
#     suit2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
#     suit = unittest.TestSuite([suit1, suit2])
#     return suit
# 可以把一个文件夹下面所有的测试脚本中的测试用例放入测试套件
    discover = unittest.defaultTestLoader.discover("../src20211230", pattern="testbaidu*.py", top_level_dir=None)
    return discover
if __name__ == "__main__":
    suit = creatSuit()
    # verbersity= 0, 1, 2  
    # 数字1代表运行后的提示信息粗略 2代表运行失败后会详细写出哪里出现错了  0只会把错误的打印出来
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suit)

3.测试用例的执行顺序

0~9 A~Z a~z

测试方法名称

4.忽略测试用例的执行

对于不想运行的测试用例打标签:

@unittest.skip("skipping")

5.unittest断言

测试用例的要素都有哪些?

测试步骤、测试数据、测试环境、预期结果

测试的最终结果其实就是判断实际结果和预期结果(符合需求标准)是否相符

断言:判断实际结果和预期结果是否相符合,(眼睛和大脑)

self.assertEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2相等
self.assertNotEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2不相等
self.assertTrue(arg1,msg = '')    # 预判表达式arg1为真
self.assertFalse(arg1,msg = '')   # 预判表达式arg1为假

6.HTML报告

运行一个测试套件,里面有上百个测试用例如何集中并且清晰的查看测试用例执行结果?

生成HTML报告的步骤:

  • 需要创建一个存放HTML报告的文件夹
curpath = sys.path[0] # 写在if __name__=="__main__" 中
# 当前路径下resultreport文件夹不存在的时候,就创建一个
if not os.path.exists(curpath+'/resultreport'):
    os.makedirs(curpath+'/resultreport')
  • 解决重复命名的问题(用当前时间来命名)
now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
filename = curpath + '/resultreport/'+ now + 'resultreport.html'
  • 报告的输出
# 使用HTMLTestRunner 要导入包import HTMLTestRunner
with open(filename, 'wb') as fp:

    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
                                           description=u"用例执行情况", verbosity=2)
    suite = createsuite()
    runner.run(suite)

7.异常捕捉和错误截图

目的:保留测试结果现场

./image “ . ”代表当前文件所在的路径下

try:
    self.assertEqual(driver.title, u"百度一下,你就知道", msg="不相等")
except:
    self.saveScreenShot(driver, "hao.png")   # 出现异常就调用截图函数进行截图

错误截图API:get_screenshot_as_file()

# 截图函数
def saveScreenShot(self, driver, file_name):   # 参数:驱动,截图名字
    if not os.path.exists("./image"):
        os.makedirs("./image")
    now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
    driver.get_screenshot_as_file("./image/"+now+"-"+file_name)
    time.sleep(3)

8.数据驱动

数据驱动就是 用测试数据来驱动测试用例代码执行

(1)安装ddt

(2)导包

from ddt import ddt, unpack, data, file_data

(3)数据驱动的方式

@data(value) 一次性传一个参数,括号中写参数

@data(value1,value2.....)一次性传多个参数,需要用@unpack映射

@file_data("json文件")

@data(*解析数据的方法(txt/csv文件))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值