selenium~使用unittest测试框架,批量执行测试脚本,addTest、makeSuite、TestLoader、discover的使用

unittest框架解析

  • unittest 是python 的单元测试框架, 在python 的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到https://www.python.org/doc/ 去了解。
  • unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。
  • 作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架。
  • 利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元, 由测试容器组织起来,到时候直接执行,同时引入测试报告.

准备工作

  • 敲好来个测试类, 继承unittest.TestCase
  • test1.py文件
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest
import time
import re


class TestBaiDu1(unittest.TestCase):

    # setUp用来初始化环境 每执行一个测试方法都会先执行这个方法
    # self表示这个类的实例
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com"

    # 测试用例必须用test开头
    def test_baiDuSearch(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").clear()
        # u表示字符编码
        driver.find_element_by_id("kw").send_keys(u"测试")
        driver.find_element_by_id("su").click()
        driver.find_element_by_id("su").click()

    def test_hao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("hao123").click()

    # 清除环境工作 每执行完一个测试用例都会执行这个
    def tearDown(self) -> None:
        time.sleep(3)
        self.driver.close()


if __name__ == "__main__":
    # 执行测试用例
    unittest.main()

  • test2.py文件
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re


class TestBaiDu2(unittest.TestCase):

    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com"

    def test_baiDuSearch(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys(u"詹姆斯")
        driver.find_element_by_id("su").click()
        driver.find_element_by_id("su").click()

    def tearDown(self) -> None:
        time.sleep(3)
        self.driver.close()


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

addTest() 的应用

  • 当有多个或者几百测试用例的时候, 这样就需要一个测试容器( 测试套件) ,把测试用例放在该容器中进行执行,unittest 模块中提供了TestSuite 类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。
  • AddTest.py文件
import unittest, csv
import test1, test2
import os, sys
import time


# 手工添加测试用例到套件
def createSuite():
    # 初始化一个测试套件
    suite = unittest.TestSuite()
    # 将测试用例添加到测试套件中
    suite.addTest(test1.TestBaiDu1("test_baiDuSearch"))
    suite.addTest(test1.TestBaiDu1("test_hao"))
    suite.addTest(test2.TestBaiDu2("test_baiDuSearch"))
    return suite


if __name__ == "__main__":
    suite = createSuite()
    # 2表示显示详细信息
    runner = unittest.TextTestRunner(verbosity=2)
    # 执行测试套件
    runner.run(suite)

makeSuite()和TestLoader()的应用

  • 上述addTest有一个不方便的就是如果一个类有十几个甚至几十个测试用例, 如果每一次多add一次的话就太麻烦了, 所以就有makeSuite()和TestLoader()他们会自动加载你输入的类中的所有此时用例

makeSuite()

  • 在unittest 框架中提供了makeSuite() 的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite ,unittest 调用makeSuite的时候,只需要把测试类名称传入即可。
  • makeSuitTest.py文件
import unittest, csv
import os, sys
import time
import test1
import test2


# 手工添加案例到套件,
def createSuite():
    suite = unittest.TestSuite()
    # 将测试用例加入到测试容器(套件)中
    suite.addTest(unittest.makeSuite(test1.TestBaiDu1))
    suite.addTest(unittest.makeSuite(test2.TestBaiDu2))
    return suite


if __name__ == "__main__":
    suite = createSuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

TestLoader()

  • TestLoader 用于创建类和模块的测试套件,一般的情况下,TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。
  • TestLoaderTest.py文件
import unittest, csv
import os, sys
import time
import test1
import test2


# 手工添加案例到套件,
def createSuite():
    suite = unittest.TestSuite()
    # 将测试用例加入到测试容器(套件)中
    suite1 = unittest.TestLoader().loadTestsFromTestCase(test1.TestBaiDu1)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(test2.TestBaiDu2)
    suite = unittest.TestSuite([suite1, suite2])
    return suite


if __name__ == "__main__":
    suite = createSuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

discover()的应用

  • discover 是通过递归的方式到其子目录中从指定的目录开始, 找到所有测试模块并返回一个包含它们对象的TestSuite ,然后进行加载与模式匹配唯一的测试文件,discover 参数分别为
    discover(dir,pattern,top_level_dir=None)
  • TestDiscover.py文件
import unittest, csv
import os, sys
import time


# 手工添加案例到套件,
def createSuite():

    # 第一个参数是扫描的路径 ../表示回到父路径, 然后递归扫描20201020这个文件下的文件
    # 第二个参数进行匹配test开头的.py结尾的文件, 如果匹配就加载里面的内容
    # 第三个参数表示测试模块的顶层目录,如果没有顶层目录,默认为None;一般都是为None
    discover = unittest.defaultTestLoader.discover('../20201020', pattern='test*.py', top_level_dir=None)
    print(discover)
    return discover


if __name__ == "__main__":
    suite = createSuite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值