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):
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 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()
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()
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():
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)