1、unittest是Python的标准库里的模块,所以在创建测试方法时,需直接导入unittest即可
2、unittest框架的六大模块:
测试用例TestCase
测试套件TestSuit:测试用例的集合,管理所有测试用例
测试执行:TestRun:
测试报告TestReport:测试结果的汇总报告
钩子方法:setUp()初始化方法和tearDown()收尾方法
断言:验证运行结果和期望值是否相等,相等就PASS
3、初期示例代码
#coding=utf-8 import unittest class Dog(): def __init__(self,name): self.name=name def getName(self): return self.name class TestDog(unittest.TestCase):#测试类,要继承unittest(属于Python的标准库)模块的TestCase类 def setUp(self): #钩子方法,初始化 self.d=Dog('wang') #实例化类 print u'初始化' def test_getName001(self):#测试用例的方法名必须以test_开头 print u'我是测试用例001' print self.d.getName() assert self.d.getName() in 'wang'#assert是python语言里的断言 '''验证getName方法的正确性''' self.assertEqual(self.d.getName(),'wang')#判断运行结果和期望值是否一致。assertEqual(a,b)是unittest的断言,验证a和b的值是否一致, def test_getName002(self): print u'我是测试用例002' def tearDown(self): #钩子方法,收尾。钩子方法是每个用例执行时都会执行 print u'收尾' if __name__=='__main__':#if成立的话,表示当前这个模块是正在运行的主程序 unittest.main(verbosity=2)#1、调用unittest.main()启动自动测试, # 2、verbosity的值是2表示打印的结果是有详细的信息
打印结果:
Ran 2 tests in 0.004s OK 初始化 我是测试用例001 wang 收尾 初始化 我是测试用例002 收尾
4、钩子方法没必要每次执行,怎样实现只执行一次,setUp()和tearDown()是用类方法@classmethod
#!/usr/bin/env.python #-*-coding:utf-8-*- import unittest from selenium import webdriver class Baidu(object): def login(self): pass class BaiduTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Firefox() cls.driver.maximize_window() cls.driver.implicitly_wait(30) cls.driver.get('https://www.baidu.com/') def test_01(self): '''验证不输入账户和密码的提示信息是否正确''' pass def test_02(self): '''验证输入用户名,不输入密码的提示信息是否正确''' pass def test_03(self): '''验证输入错误用户名的提示信息是否正确''' self.assertEqual(123,12) @classmethod def tearDownClass(cls): cls.driver.quit() if __name__=='__main__': unittest.main(verbosity=2)
运行的时候,浏览器只打开和关闭了一次,运行结果如下:
test_01 (__main__.BaiduTest) 验证不输入账户和密码的提示信息是否正确 ... ok test_02 (__main__.BaiduTest) 验证输入用户名,不输入密码的提示信息是否正确 ... ok test_03 (__main__.BaiduTest) 验证输入错误用户名的提示信息是否正确 ... FAIL ====================================================================== FAIL: test_03 (__main__.BaiduTest) 验证输入错误用户名的提示信息是否正确 ---------------------------------------------------------------------- Traceback (most recent call last): File "D:/panda/Python/python_me/week7-5/unit1/test01.py", line 25, in test_03 self.assertEqual(123,12) AssertionError: 123 != 12 ---------------------------------------------------------------------- Ran 3 tests in 11.007s FAILED (failures=1) Process finished with exit code 1
5、测试套件,将测试用例add到测试套件中,执行的时候执行测试套件
#!/usr/bin/env.python #-*-coding:utf-8-*- import unittest class Food(): def add(self,a,b): return a+b class FoodTest(unittest.TestCase): def setUp(self): self.f=Food() def test_01(self): '''测试a,b为整型''' sum=self.f.add(2,3) self.assertEqual(sum,5) def test_02(self): '''测试a浮点数,b为整型''' sum = self.f.add(2.36, 2) self.assertEqual(sum,4.36) def tearDown(self): pass if __name__=='__main__': suite=unittest.testSuite() suite.addTests(FoodTest('test_01','test_02')) unittest.TextTestRunner(verbosity=0).run(suite)
5.1、将suite写到类的方法中,简化执行用例时的代码
#!/usr/bin/env.python #-*-coding:utf-8-*- import unittest from selenium import webdriver class BaiduTest(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Firefox() cls.driver.maximize_window() cls.driver.implicitly_wait(30) cls.driver.get('https://www.baidu.com/') def test_01(self): '''验证不输入账户和密码的提示信息是否正确''' pass def test_02(self): '''验证输入用户名,不输入密码的提示信息是否正确''' pass def test_03(self): '''验证输入错误用户名的提示信息是否正确''' self.assertEqual(123,12) @classmethod def tearDownClass(cls): cls.driver.quit() @staticmethod def suite(testNum): suite=unittest.TestSuite() suite.addTest(BaiduTest(testNum)) return suite if __name__=='__main__': unittest.TextTestRunner(verbosity=2).run(BaiduTest.suite('test_01'))