IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> unittest框架的学习心得 -> 正文阅读

[开发测试]unittest框架的学习心得

import unittest
class MyTest(unittest.TestCase):
    @unittest.skip("直接跳过测试")
    def test_skip(self):
        print("test aaa")
    @unittest.skipIf(3>2,"当条件为真时跳过测试")
    def test_skip_if(self):
        print('test bbb')
    @unittest.skipUnless(3>2,"当条件为真时执行测试")
    def test_skip_unless(self):
        print('test ccc')
    @unittest.expectedFailure
    def test_expected_failure(self):
        self.assertEqual(2,3)
if __name__ == '__main__':
    unittest.main()
  • 跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或者当测试用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败。unittest提供了实现这些需求的装饰器。

    • 无条件地跳过装饰的测试,需要说明跳过测试的原因。

      unittest.skip(reason)

    • 如果条件为真,则跳过装饰的测试

      unittest.skipIF(condition,reason)

    • 当条件为真时,执行装饰的测试

      @unittest.skipUnless(3>2,"当条件为真时执行测试")

    • 不管执行结果是否失败,都将测试标记为失败。

      unittest.expectedFailure

  • 测试用例的执行顺序?

unittest提供了可以共享的defaultTestLoader类,可以使用其子类或方法创建实例,discover()方法就是其中之一。

unittest.defaultTestLoader.discover(start_dir,pattern='test*.py',top_level_dir=None)

找到指定目录及其子目录下的所有测试模块,只有匹配的文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。

  • start_dir:待测试的模块名或测试用例目录。
  • pattern='test.py':测试用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“”表示任意多个字符。
  • top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为None。

测试用例的执行顺序涉及多个层级:多个测试目录>多个测试文件>多个测试方法(测试用例)。unittest提供的main()方法和discover()方法是按照什么顺序查找测试用例的呢?

其实,unittest默认根据ASCII码的顺序加载测试用例的(数字与字母的顺序为0~9,A~Z,a~z),所以TestAdd类会优先于TestBdd类被执行,testaaa()方法会优先于test_ccc()方法被执行,也就是说,它并不是按照测试用例的创建顺序从上到下执行的

discover()方法和main()方法的执行顺序是一样的。对于测试目录与测试文件来说,上面的规律同样适用。test_aaa.py文件会优先于test_bbb.py文件被执行。所以,如果想让某个测试文件先执行,可以在命名上加以控制

当然,也可以用到前面介绍过的测试套件TestSuite,通过addTest()方法将测试用例加入测试套件,则会按照套件里的添加顺序去加载测试用例。

不过,当测试用例非常多时,不推荐用这种方法创建测试套件,最好的方法是通过命名控制执行顺序。如果测试用例在设计时不产生相互依赖,那么测试用例的执行顺序就没那么重要了。

以下抛弃了unittest提供的main()方法,调用TestSuite类下面的addTest()来添加测试用例。然后将Testsuite放入TestRunner里面进行启动。

import unittest
import Calculator

class TestCalculator(unittest.TestCase):

    def setUp(self):    #Test Fixture-每条用例开始执行前,执行该方法
        print("开始执行测试")

    def tearDown(self):  #Test Fixture-每条用例结束执行后,执行该方法
        print("执行测试结束")

    def test_add(self):
        result = Calculator.Add(1, 2)
        self.assertEqual(result, 3)


    def test_sub(self):
        result = Calculator.Substract(5, 1)
        self.assertEqual(result, 4)

    def test_mul(self):

        result = Calculator.Multiply(5, 1)
        self.assertEqual(result, 6)

    def test_div(self):
        result = Calculator.Divide(6, 2)
        self.assertEqual(result, 3)

if __name__ == '__main__':
    #创建测试套件TestSuite
    suit = unittest.TestSuite()
    suit.addTest(TestCalculator("test_add"))
    suit.addTest(TestCalculator("test_sub"))
    suit.addTest(TestCalculator("test_mul"))
    suit.addTest(TestCalculator("test_div"))

    #创建测试运行期TestRunner
    runner = unittest.TextTestRunner()
    runner.run(suit)

这样做比直接使用main()方法要麻烦得多,但也有优点,可灵活的控制用例的执行顺序。

  • 首先,测试用例的执行顺序可以由测试套件的添加顺序控制,而main()方法只能按照测试类、方法的名称来执行测试用例。例如,TestA类比TestB类先执行,test_add()用例比test_div()用例先执行。

  • 其次,当一个测试文件中有很多测试用例时,并不是每次都要执行所有的测试用例,尤其是比较耗时的U自动化测试。因而通过测试套件和测试运行器可以灵活地控制要执行的测试用例。

不过一个一个地添加测试用例到测试套件中,有点麻烦,所以可以把要执行的测试用例用个列表来管理,然后再把这个列表添加到测试套件中

import unittest
import Calculator

class TestCalculator(unittest.TestCase):

    def setUp(self):    #Test Fixture-每条用例开始执行前,执行该方法
        print("开始执行测试")

    def tearDown(self):  #Test Fixture-每条用例结束执行后,执行该方法
        print("执行测试结束")

    def test_add(self):
        result = Calculator.Add(1, 2)
        self.assertEqual(result, 3)


    def test_sub(self):
        result = Calculator.Substract(5, 1)
        self.assertEqual(result, 4)

    def test_mul(self):

        result = Calculator.Multiply(5, 1)
        self.assertEqual(result, 6)

    def test_div(self):
        result = Calculator.Divide(6, 2)
        self.assertEqual(result, 3)

if __name__ == '__main__':
    # 构造测试套件
    suite = unittest.TestSuite()
    test_cases = [TestCalculator("test_add"), TestCalculator("test_sub"), TestCalculator("test_div")]
    suite.addTests(test_cases)
    # 执行测试
    runner = unittest.TextTestRunner(
        verbosity=2)  # verbosity 参数可以控制输出的错误报告的详细程度,默认是 1;如果设为 0,则不输出每一用例的执行结果;如果设为 2,则输出详细的执行结果
    runner.run(suite)
unittest的setup、teardown会在每个用例执行前后执行一次,如上面测试用例类中有4个测试用例,
那么每个用例执行前会执行setup,执行后会执行teardown,即setup、teardown总共会调用4次,
但考虑实际自动化测试场景,多个用例只需执行一次setup,全部用例执行完成后,执行一次teardown,
针对该种场景,unittest的处理方法是使用setupclass、teardownclass,注意@classmethod的使用,
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:16:52  更:2021-09-19 08:17:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:38:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码