Python单元测试框架-UnitTest以及测试报告

2022-04-07 14:12:47 浏览数 (1)

在周三的公众号文中,芒果给大家提前剧透了分层自动化测试过程中最重要的一环——单元测试。晚上的测试运维直播课程中,芒果带着大家一起了解了Python的单元测试框架——UnitTest,这里我们来做个小总结。

UnitTest介绍

先来回顾一下单元测试的概念:

指对软件中最小的可测试单元进行检查和验证,一般需要借助单元测试框架,如java的Junit、TestNG,python的unittest等。

再来看看UnitTest:

unittest是Python的内建模块,是Python单元测试的事实标准。 unittest不仅可以适用于单元测试,还可以适用web自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

几个概念

在开始使用UnitTest执行单元测试之前我们先了解几个概念:

test case:测试用例,可以通过创建unitest.TestCase类的子类创建一个测试用例。

test fixture:测试夹具,包含执行测试用例前的测试准备工作、测试用例执行后的清理工作(分别对应TestCase中的setUp()和tearDown()方法),测试准备和测试清理的目的是保证每个测试用例执行前后的系统状态一致。

test suite:测试套件,是测试用例、测试套件或者两者的集合,用来将有关联的测试项打包。

test runner:负责执行测试并将结果展示给用户,可以展示图形或文字形式(unittest.TextTestRunner)的结果,或者返回一个错误码标识测试用例的执行结果。testrunner提供了一个方法run(),接受一个unittest.TestSuite或unittest.TestCase实例作为参数,执行对应测试项目后返回测试结果unittest.TestResult对象。

UnitTest处理流程

在对于几个基本的概念有所了解之后,我们一起来看看UnitTest处理流程是如何进行的:

使用unitest.TestCase类的子类创建一个测试用例类,其中可以包含多个测试用例,并且利用estCase中的setUp、tearDown、setUpClass、tearDownClass等方法处理好初始化以及环境清理工作。

代码语言:javascript复制
#被测试函数-腾讯课程课程搜索测试
def courseSearch(driver,searchKey):
    #打开腾讯课堂
    driver.get("https://ke.qq.com/")

    #搜索对应课程
    driver.find_element_by_id("js_keyword").send_keys(searchKey)
    time.sleep(2)
    driver.find_element_by_id("js_search").click()
    time.sleep(2)

    #查询结果
    keyElement = driver.find_element_by_css_selector("div.kw-outer>span.bold")

    #对比实际结果与预期结果
    if keyElement.text.lower() == searchKey.lower():
        return True
    else:
        return False

#测试用例类
class CourseSearchTest(unittest.TestCase):
    #环境构建-启动浏览器
    def setUp(self):
        self.driver = webdriver.Chrome()

    #第一个测试用例   
    def test_01(self):
        result = courseSearch(self.driver, "testops")
        self.add_img()
        self.assertTrue(result)
        #print(result)

    #第二个测试用例
    def test_02(self):
        result = courseSearch(self.driver, "软件测试")
        self.add_img()
        self.assertTrue(result)
        #print(result)

    #环境清理-关闭浏览器
    def tearDown(self):
        self.driver.quit()

然后就是用例的加载问题了(当然UnitTest的用例加载方式有更多,这里仅仅提供几种简单的加载方式):

代码语言:javascript复制
#最简单的用例加载与执行
unittest.main()

#用例加载方式一
suite = unittest.TestSuite()
suite.addTest(CourseSearchTest("test_01"))
suite.addTest(CourseSearchTest("test_02"))

# 用例加载方式二
suite = unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(CourseSearchTest))

#用例加载方式三
suite = unittest.TestSuite()
tests = ["test_course_search.CourseSearchTest.test_01",
"test_course_search.CourseSearchTest.test_02"]
suite.addTest(unittest.TestLoader().loadTestsFromNames(tests))

#用例加载方式四
suite = unittest.defaultTestLoader.discover(os.getcwd(),pattern="test_course_search*.py")

接着是执行,一般使用UnitTest所带的TextTestRunner处理执行,它会在执行结束之后给TestResult赋值,我们可以通过TestResult来获取相关结果。

代码语言:javascript复制
#执行用例
unittest.TextTestRunner().run(suite)

测试报告以及其优化

当然除了可以根据TestResult查看测试结果,我们还可以利用扩展模块HTMLTestRunner类来生成测试HTML版的测试报告。

代码语言:javascript复制
#HTML测试报告
fp = open("restult_course_search.html","wb")

runner = HTMLTestRunner.HTMLTestRunner(stream=fp,verbosity=2,
title="腾讯课堂课程搜索测试",
description="课程搜索以及结果判断")

runner.run(suite)

这里芒果顺便给大家介绍一个开源的优化版测试报告HTMLTestRunner_cn。

GitHub地址:

https://github.com/GoverSky/HTMLTestRunner_cn

后续的啰啰嗦嗦

当然除了课程内容除了这些基本的介绍,芒果还给大家介绍了,关于UnitTest各种断言方法、用例过滤方式、Django项目的单元测试,以及关于优化版的测试报告的使用。

0 人点赞