1、testcase
一个tastcase是一个测试用例,什么是测试用例?就是一个完整的测试流程,包含测试的准备环境的准备(setup),执行测试代码(run)以及测试后环境的还原(teardown)执行代码(run),以及测试后环境的还原。
2、testsuite
多个用例集合到一起
3、texttestrunner
执行用例的。其中的run()会执行Testsuite、testcase中的run(result)方法。测试的结果会保存再Texttestresult实例中,包含运行了多少测试用例,成功了多少,失败了多少等信息
4、fixture
而对一个测试用例环境的搭建和销毁,是一个fixture
例:对下列单元进行测试
class Math(): def __init__(self,a,b): self.a=int(a) self.b=int(b) def add(self): return self.a+self.b
测试代码:
from calculator import Math import unittest class TestMath(unittest.TestCase): def setUp(self): print("test start~~~~") def test_add(self): j=Math(5,20) self.assertIs(j.add(),25) # self.assertEqual(j.add(),15) def tearDown(self): print("test end!") if __name__=='__main__': suite=unittest.TestSuite() suite.addTest(TestMath("test_add")) runer=unittest.TextTestRunner() runer.run(suite)
常用断言方法:
断言内容事自动化脚本的重要内容,正确设置断言以后才能帮助我们判断测试用例执行结果
断言方法:
assertEqual(a,b)判断a==b
assertNotEqul(a,b)判断a!=b
assertTrue(x)bool(x) is True
assertFalse(x)bool(x) is False
assertIs(a,b) a is b
assertIsNot(a,b) a is not b
assertIsNone(x) x is None
新增用例测试管理:多个测试一起执行
import unittest from calculator import * class Test_add(unittest.TestCase): def setUp(self): print("test start !") def test_add(self): j=Math(5,5) self.assertEqual(j.add(),10) def test_add1(self): j=Math(10,20) self.assertEqual(j.add(),30) def tearDown(self): print("test end !") class Test_sub(unittest.TestCase): def setUp(self): print("test start !") def test_sub(self): i=Math(8,8) self.assertEqual(i.sub(),0) def test_sub1(self): i=Math(5,3) self.assertEqual(i.sub(),2) def tearDown(self): print("test end !") if __name__=='__main__': suite=unittest.TestSuite() suite.addTest(Test_add("test_add")) suite.addTest(Test_add("test_add1")) suite.addTest(Test_sub("test_sub")) suite.addTest(Test_sub("test_sub1")) runer=unittest.TextTestRunner() runer.run(suite)
用例公共部分合并
每个测试类都有一个SetUp()和tearDown()方法,而且两个方法内容都是一样的,用于打印开始与结束提示语句,是否可以合并在一起呢?
import unittest from calculator import * class StartEnd(unittest.TestCase): def setUp(self): print("test start !") def tearDown(self): print("test end !") class Test_add(StartEnd): def test_add(self): f=Math(1,9) self.assertEqual(f.add(),10) class Test_sub(StartEnd): def test_sub(self): j=Math(10,0) self.assertEqual(j.sub(),10) if __name__=='__main__':
# suite=unittest.TestSuite()
# suite.addTest(Test_add("test_add"))
# suite.addTest(Test_sub("test_sub"))
#
# runner=unittest.TextTestRunner()
# runner.run(suite)
unittest.main()
用例综合框架的管理
测试用例和执行放到一个文件就比较混乱,因此需要根据功能模块来使用单独的模块来管理.就像一个学校根据不同年纪进行分班管理,同样的道理
案例:Test_Project文件目录下包含4个python文件:
1、--StartEnd.py----setup和teardown
2、--calculator.py---加减法运算方法的实现
3、--test_add.py----加法测试用例
4、--test_sub.py---减法测试用例
5、---runtest.py---用例执行管理
startend.py
import unittest class setup_teardown(unittest.TestCase): def setUp(self): print("test start !") def tearDown(self): print("test end!")
calculator.py
class Math(): 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
test_add.py
from calculator import * from StartEnd import * class Test_add(setup_teardown): def test_add(self): i=Math(1,9) self.assertEqual(i.add(),10) def test_add2(self): i=Math(3,2) self.assertEqual(i.add(),5)
test_sub.py
from calculator import * from StartEnd import * class Test_sub(setup_teardown): def test_sub(self): i=Math(10,1) self.assertEqual(i.sub(),9) def test_sub2(self): j=Math(0,0) self.assertEqual(j.sub(),0)
runtest.py
import unittest test_dir='./' discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*py') if __name__=='__main__': runner=unittest.TextTestRunner() runner.run(discover)
跳过测试和预期失败
概要:
unittest.skip()直接跳过测试
unittest.skipIf()条件为真跳过测试
unittest.skipUnless条件为假,跳过测试
unittest.exceptedFailure预期设置失败
skip规则设定案例:
用法
@unittest.skip(“填写跳过原因”)
@unittest.skipIf(4>2,“填写跳过原因”)