unittest的使用

1、初识

calculator.py

class Count:
	def __init__(self, a, b):
		self.a = int(a)
		self.b = int(b)

	def add(self):
		return self.a + self.b
from calculator import Count
import unittest
# 测试用例
class KestCount(unittest.TestCase):
	# 用例执行初始化
	def setUp(self):
		print("test start")
	def test_add(self):
		j = Count(2, 3)
		# 断言继承自TestCase,调用函数是不是==5
		self.assertEqual(j.add(), 5)
	# 用例执行完的善后
	def tearDown(self):
		print("test end")
# 当自己直接执行的时候,执行。。当作为模块引入的时候,不执行下面的
if __name__ == '__main__':
	# 会执行继承TestCase的用例,执行所有以test开头命名的测试方法
	unittest.main()

2、Text Suite的使用

# 当有多个测试用例时
# 单元测试包括:Test Case测试用例
# 和Test Suite测试套件,可通过addTest将多个测试用例集合起来
# 和Test Runner测试执行,通过TextTestRunner类提供的run()来执行testsuite或TestCase
# 和test fixture测试环境的搭建和销毁,包括setUp和tearDown
from calculator import Count
import unittest

class TestCount(unittest.TestCase):
	def setUp(self):
		print('test begin')

	def test_add1(self):
		j = Count(2,3)
		self.assertEqual(j.add(), 5)

	def test_add2(self):
		j = Count(41, 23)
		# 断言方法
		# assertEqual(a, b, msg),a和b是否相等,不相等输出msg,可选
		# assertNotEqual(a, b, msg),与上个相反
		# assertTrue(expr, msg),expr表达式是true
		# assertFalse(expr, msg),expr表达式是false
		# assertIn(a, b, msg),b包含a吗,"hello world"包含"hello"
		# assertNotIn(a, b, msg)相反

		self.assertEqual(j.add(), 64)

	def tearDown(self):
		print('test end')

if __name__ == '__main__':
	# 构建测试集
	suite = unittest.TestSuite()
	# 通过addTest有选择的执行测试用例,可以同时执行1个或多个
	# suite.addTest(TestCount('test_add1'))
	suite.addTest(TestCount('test_add2'))
	# 执行测试
	runner = unittest.TextTestRunner()
	runner.run(suite)

3、扩展calculator.py中的方法

class Count:
	def __init__(self, a, b):
		self.a = int(a)
		self.b = int(b)

	def add(self):
		return self.a + self.b

	def sub(self):
		return self.a - self.b
# 扩展测试用例:calculator文件,增加了sub方法
from calculator import Count
import unittest

class TestAdd(unittest.TestCase):
	def setUp(self):
		print('test add start')

	def add1(self):
		j = Count(2, 3)
		self.assertEqual(j.add(), 5)

	def add2(self):
		j = Count(1, 2)
		self.assertEqual(j.add(), 3)

	def tearDown(self):
		print('add end')

class TestSub(unittest.TestCase):
	def setUp(self):
		print('test sub start')

	def test_sub1(self):
		j = Count(3, 2)
		self.assertEqual(j.sub(), 1)

	def test_sub2(self):
		j = Count(4, 2)
		self.assertEqual(j.sub(), 2)

	def tearDown(self):
		print('test sub end')

if __name__ == '__main__':
	# 测试用例执行的顺序,为添加套件的顺序,
	# unittest.main()是以ASCII码的顺序
	suite = unittest.TestSuite()
	suite.addTest(TestAdd('add1'))
	suite.addTest(TestAdd('add2'))
	suite.addTest(TestSub('test_sub1'))
	suite.addTest(TestSub('test_sub2'))

	runner = unittest.TextTestRunner()
	runner.run(suite)

# 当setUp和tearDown都一样时,可以抽离
# class MyTest(unittest.TestCase):
# 	def setUp():
# 	def tearDown():
# class TestAdd(MyTest):
# 	......

4、discover的使用

# 将每个测试类和run都拆分
# 这只是一个run文件
# discover()方法匹配测试用例文件,并将查找的测试用例组装到测试套件中
# 而不需要通过suite一个一个添加套件
# 识别以test开头的测试用例,test3.py中的add方法,没有以test开头,所以不会识别
import unittest
# 定义测试用例的目录为当前目录,匹配以test开头的文件
# 为当前目录,想要查找子目录,需要每个子目录放一个__init__.py文件,变为当前目录包的子包
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

if __name__ == '__main__':
	runner = unittest.TextTestRunner()
	runner.run(discover)

5、跳过测试

# 跳过测试,当不想测试那条时,可以跳过
# 这些方法同样可以应用于测试类,只要写在测试类上面就行
import unittest

class TestSkip(unittest.TestCase):
	def setUp(self):
		print('start')

	def tearDown(self):
		print('end')

	@unittest.skip("跳过测试")
	def test1(self):
		print('无条件跳过测试,并说明原因')

	@unittest.skipIf(3>2, "当条件为true时,跳过测试")
	def test2(self):
		print("当条件为true时,跳过测试,说明原因")

	@unittest.skipUnless(3>2, "当条件为true时执行测试")
	def test3(self):
		print('当条件为true时执行测试,说明原因')

	# 无论结果为什么,一律失败
	@unittest.expectedFailure
	def test4(self):
		print('无论结果都失败')

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值