python+selenium自动化测试-22python单元测试框架unittest(原理详解)

1、unittest概述

单元测试框架提供了一种统一的编程模型,可以将测试定义为一些简单的类,这些类中的方法可以调用希望测试的应用程序代码。单元测试框架提供了测试运行程序(runner),只需要单击按钮就可以执行所有测试。

unittest单元测试框架是针对python语言开发的框架,适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了实际结果与预期结果对比的断言方法,判断测试用例是否通过,最终生成测试结果。

2、unittest核心要素

2.1TestCase

所有的测试类都继承unittest提供的基类TestCase,一个TestCase的实例就是一个测试用例。一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

2.2TestSuite

相当于一个容器,将多个测试用例集合在一起,就是TestSuite。TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

2.3TextTestRunner

TextTestRunner是来执行测试用例的,其中的run(testSuite)会执行TestSuite/TestCase中的run()方法。测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

2.4Fixture

一个test fixture所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作,这包括:创建临时或代理数据库、目录或开始服务器进程。主要有setUp()和tearDown()及setUpClass()和tearDownClass()这两种配对方法。下一节将展开讲这两种配对方法的区别。

3、unittest运行原理

在这里插入图片描述

4、unittest使用要点

4.1 一个测试类里面,如果写了多个方法,最终算是多个测试用例呢?还是一个测试用例呢?

(1)对每一个以test开头的方法,系统都为其构建了一个TestCase对象,系统也只执行TestCase对象的方法。
(2)如果没有定义test开头的方法,而是将方法写到TestSuite里面,run(testSuite)方法构建TestCase对象,如果定义了test开头的方法,就会忽略run()方法。这里只推荐每个方法都以test开头的标准化处理,因为如果每一个测试用例单独写成一个TestCase的话,会有很多的冗余代码。

4.2 以test开头的方法的执行顺序是怎样的?

方法的执行顺序不是方法在代码中的先后顺序,而是ASCII码的字符的先后顺序。先执行哪个类或者哪个python文件,依据还是ASCII码的字符的先后顺序。只有当使用普通模式下运行这个程序,才会按照顺序去执行。这里值得注意的是,用unittest.main()批量执行用例时,不带test开头的方法将会被忽略,不会执行。

5、unittest使用(代码演示)

5.1检验执行顺序和非test开头是否被执行

class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setupclass")

    def test_A(self):
        print("test_A")

    def test_a(self):
        print("test_a")

    def test_2(self):
        print("test_2")

    def gest_3(self):#故意将test写成gest,看是否会被执行
        print("gest_3")

    @classmethod
    def tearDownClass(cls):
        print("teardownclass")


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

执行结果:

...
setupclass
test_2
test_A
test_a
teardownclass
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Process finished with exit code 0

5.2加入TestSuite去执行

class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setupclass")

    def test_A(self):
        print("test_A")

    def test_a(self):
        print("test_a")

    def test_2(self):
        print("test_2")

    def gest_3(self):#故意将test写成gest,看是否会被执行
        print("gest_3")

    @classmethod
    def tearDownClass(cls):
        print("teardownclass")


if __name__ == '__main__':
    testsuite = unittest.TestSuite()
    testsuite.addTest(TestDemo("test_2"))
    testsuite.addTest(TestDemo("test_a"))
    testsuite.addTest(TestDemo("gest_3"))#gest_3()将会被执行
    testsuite.addTest(TestDemo("test_A"))
    runner = unittest.TextTestRunner()
    runner.run(testsuite)

执行结果:

setupclass
....
test_2
test_a
gest_3
test_A
teardownclass
---------------------------------------------------------------
Ran 4 tests in 0.000s
OK
Process finished with exit code 0
发布了46 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_24601279/article/details/103013817