pythonunittest模块_Python3学习笔记26-unittest模块

unittest单元测试框架,主要由四部分组成:测试固件、测试用例、测试套件、测试执行器

测试固件(test fixture)

测试固件有两部分,执行测试前的准备部分setUp(),测试执行完后的清扫部分tearDown()

测试用例(test case)

测试用例中,包含测试固件,具体的测试代码的函数。测试固件可以不写,但是至少要有一个以test开头的函数。

unittest会自动识别test开头的函数是测试代码,一定要用小写的test开头!,下面看一个实例

在PyCharm中新建一个项目,在下面建一个包叫做lesson_unittest,然后在这个包下面新建一个.py文件叫做lesson_test_fixture1,然后写下面的代码

importunittestfrom io importStringIOclasslesson(unittest.TestCase):defsetUp(self):

self.f=StringIO()print("创建StringIO")deftearDown(self):

s=self.f.getvalue()print("读取StringIO:",s)deftest_case1(self):

self.f.write("test case 1")print("写入test case 1")deftest_case2(self):

self.f.write("test case 2")print("写入test case 2")if __name__ =='__main__':

unittest.main()

所有方法中一定要带self这个变量

unittest.main()在PyCharm可以不要,如果要在cmd中运行,一定要加上这行

setUp()执行成功之后,不管test中有没有异常发生,tearDown()都会执行

可以看出上面这个实例在执行每个test之前和之后都会去调用setUp()和tearDown()这个方法

很多时候我们只想执行一次测试固件:比如setUp()中放着连接数据库操作,多个test case放着不同数据库操作,然后tearDown()断开数据连接

使用setUpClass()和tearDownClass()可以的得到这样的效果,必须被装饰成classmethod

使用装饰器@unittest.skip可以跳过某个测试用例不执行

在刚才lesson_unittest包下,再新建一个.py文件叫做lesson_test_fixture2,然后写下面的代码

importunittestfrom io importStringIOclasslesson(unittest.TestCase):

@classmethoddefsetUpClass(cls):

cls.f=StringIO()print("创建StringIO")

@classmethoddeftearDownClass(cls):

s=cls.f.getvalue()print("读取StringIO:",s)deftest_case1(self):

self.f.write("test case 1")print("写入test case 1")deftest_case2(self):

self.f.write("test case 2")print("写入test case 2")if __name__ =='__main__':

unittest.main()

测试执行器(test runner)

test runner用来执行加载的测试用例,可以是单个测试用例,也可以是测试套件

一种就是上方实例中的直接使用unittest.main()去执行,会搜索所有以test开头的测试用例,按照ASCII的顺序执行多个用例

另一种就是使用TextTestRunner()方法初始化一个测试执行器,然后使用run()去执行测试套件

runner =unittest.TextTestRunner()

runner.run(suite)

这里suite是指测试套件的实例

测试套件(test suite)

很多测试用例的集合就是测试套件,通过测试套件来管理多个测试用例,会根据用例的加载顺序执行用例

使用TestSuite()初始化一个Suite实例

使用addTest()方法加载测试方法到测试套件中,addTest()如果要在传入别的包下的测试方法:  包名.类名(测试方法函数)

suite =unittest.TestSuite()

suite.addTest(lesson('test_case1'))#lesson是类名,test_case1是测试函数

suite.addTest(lesson('test_case2'))#如果是lesson是其他包下的,就是包名.lesson(‘test_case2’)

runner =unittest.TextTestRunner()

runner.run(suite)

将文章第一个示例中最后一行unittest.main()换成上方代码执行

使用makeSuite()可以把一个类下面所有测试方法都加载到测试套件中

目前项目路径应该是这样的,最上面是项目,然后包,最后是.py文件。一定要有__init__.py文件,不然引用不到

在项目下新建一个.py文件,名字随便不要带test,或lesson就行。在项目下新建,不要在包里,不要在包里,不要在包里

importunittestfrom lesson_unittest.lesson_test_fixture1 importlesson

suite=unittest.TestSuite(unittest.makeSuite(lesson))if __name__=='__main__':

runner=unittest.TextTestRunner()

runner.run(suite)

可以看到把lesson两个测试用例都执行了,但是使用makeSuite()还是有些繁琐。要把写的所有的类都加到测试套件中

最常用的是使用discover()方法可以把指定路径下所有测试方法都加载到测试套件中

使用刚才实验makeSuite()方法的那个.py文件,清空代码输入以下代码

importunittest

test_dir= 'D:/PycharmProjects/PythonLesson/lesson_unittest'discover= unittest.defaultTestLoader.discover(test_dir, pattern='lesson*.py')

runner=unittest.TextTestRunner()

runner.run(discover)

test_dir是指定的路径,pattern是指定的文件名。pattern参数是定义文件名匹配规则的,可以随便修改

比如这里lesson*.py是指文件名以lesson开头的文件

也可以写成*test*文件带有test的文件

如果是*lesson.py,那就是指文件名以lesson.py结尾的文件

*起到跟通配符差不多的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我了解了你的问题。下面是我的回答: 在Python中,我们经常需要编写测试用例来确保我们编写的代码的正确性。unittest模块Python中一个流行的测试框架,它提供了TestCase类来编写测试用例。TestCase类中有六种常用的断言方法: 1. assertEqual(a, b):判断a和b是否相等。 2. assertNotEqual(a, b):判断a和b是否不相等。 3. assertTrue(x):判断x是否为True。 4. assertFalse(x):判断x是否为False。 5. assertIn(a, b):判断a是否在b中。 6. assertNotIn(a, b):判断a是否不在b中。 除了这些断言方法,TestCase类还有setUp()函数,它是在每个测试方法执行之前都会被调用的函数。setUp()函数通常用来初始化测试环境,例如创建测试数据或者初始化测试对象。这样可以确保每个测试方法都是在相同的测试环境下运行的,从而保证测试的准确性和可重复性。 下面是一个简单的示例代码,展示了如何使用unittest模块编写测试用例和使用断言方法进行断言: ```python import unittest class TestStringMethods(unittest.TestCase): def setUp(self): self.test_string = "hello world" def test_upper(self): self.assertEqual(self.test_string.upper(), "HELLO WORLD") def test_lower(self): self.assertEqual(self.test_string.lower(), "hello world") def test_isupper(self): self.assertFalse(self.test_string.isupper()) self.assertTrue(self.test_string.upper().isupper()) def test_split(self): s = "hello world" self.assertEqual(s.split(), ["hello", "world"]) if __name__ == '__main__': unittest.main() ``` 在这个示例代码中,我们定义了一个名为TestStringMethods的测试类,它继承自unittest.TestCase类。在这个测试类中,我们定义了四个测试方法,每个方法都使用了不同的断言方法。在setUp()函数中,我们创建了一个测试字符串,它会在每个测试方法中被使用。最后,我们使用unittest.main()函数运行这个测试类,输出测试结果。 希望这个回答能够解决你的问题。如果你还有其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值