目录:
1.unitest简介
2.断言方法
3.组装测试用例+run
4.用例执行的顺序
5.skip装饰器--跳过测试和预期失败
6.生成html测试报告
7.自动发送邮件
一、unitest简介
1、什么是单元测试?
①单元测试负责对最小的软件设计单元进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。
②以代码测试代码
2、重要概念
1).Test Case (一个TestCase的实例就是一个测试用例)
一个完整的测试流程包括:
①测试前准备环境的搭建,每个用例运行之前运行的(setUp)
②实现测试过程的代码(run)
③测试后环境的还原(tearDown)
2).Test Suite (测试套件:把多条用例放在一起执行,作用:TestSuite用来组装单个测试用例)
3).Test Runner (测试的执行)
4).Test Fixture
二、断言方法
1、在执行用例过程中,最终用例是否执行通过,是通过判断测试得到的实际结果与预期结果是否相等决定的
2、unittest框架的TestCase类提供下面这些方法用于测试结果的判断

三、组装测试用例+run
①suite.addTest() 当测试用例集更多,runtest逐一添加过于麻烦,就可以用第2种方法
import unittest
from chaifen.testadd import TestAdd
from chaifen.testsub import TestSub
suite = unittest.TestSuite() # 定义一个测试集合
suite.addTest(TestAdd("test_add"))
suite.addTest(TestAdd("test_add2"))
suite.addTest(TestSub("test_sub"))
suite.addTest(TestSub("test_sub2"))
if __name__ == '__main__':
runner=unittest.TextTestRunner()
runner.run(suite)
② TestLoader类中的discover()方法
unittest.defaultTestLoader.discover(start_dir, pattern, top_level_dir)
start_dir:要测试的模块名或测试用例目录
pattern=‘test*.py':表示用例文件名的匹配原则。
top_level_dir=None:测试模块的顶层目录,如果没有顶层,默认为None。
import unittest testdir = './' # 定义测试用例的目录 discover = unittest.defaultTestLoader.discover(testdir, pattern='test*.py') if __name__ == '__main__': runner=unittest.TextTestRunner() runner.run(discover)
四、用例执行的顺序
unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0~9、A~Z、a~z
五、skip装饰器--跳过测试和预期失败
在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试。
①unittest.skip(reason) 无条件地跳过装饰的测试,说明跳过测试的原因。
②unittest.skipIf(condition,reason) 跳过装饰的测试,如果条件为真时。
③unittest.skipUnless(condition, reason) 跳过装饰的测试,除非条件为真。
④unittest.expectedFailure 测试标记为失败。不管执行结果是否失败,统一标记为失败。
import unittest class MyTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @unittest.skip("跳过次case") def test_skip(self): print("aaa") @unittest.skipIf(3 > 2, '当条件为true时跳过测试') def test_skip_if(self): print('bbb') @unittest.skipUnless(3 > 2, '跳过测试,除非条件为真') def test_skip_unless(self): print('ccc') @unittest.expectedFailure # 不管执行结果是否失败,统一标记为失败 def test_expexted_failure(self): self.assertEqual(2,2)
⑤setUp与setUpClass 区别:
setup():每个测试 case运行前运行
teardown():每个测试 case运行完后执行
setUpClass():必须使用@classmethod 装饰器,所有case运行前只运行一次
tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次
注:@是修饰符,classmethod 是python里的类方法
六、unittest批量执行
七、生成html测试报告
1、BeautifulReport
①下载:pip install BeautifulReport
②代码如下:
import unittest from 其它.our_testcase import TestFunc from BeautifulReport import BeautifulReport as bf if __name__ == '__main__': suite = unittest.TestSuite() # 定义一个测试集合 tests = [TestFunc("test_square"), TestFunc("test_lower_str"),TestFunc("test_multi"),TestFunc("test_add")] # 把写的用例加进来 suite.addTests(tests) run = bf(suite) # 实例化BeautifulReport模块 run.report(filename='beautiful_reporter', description='测试练习', report_dir='../selenium', theme='theme_cyan') run.report()
filename :测试报告的文件名称;
description:测试报告里面的用例名称展示
report_dir:测试报告的文件存储路径
theme:报告主题名 theme_default theme_cyan theme_candy theme_memories
2、HTMLTestRunner
①下载
http://tungwaiyip.info/software/HTMLTestRunner.html 下载后放在python的Lib目录下
然后需要修改HTMLTestRunner文件:
第94行:import StringIO 改为import io
第539行:self.outputBuffer = StringIO.StringIO() 改为:self.outputBuffer = io.StringIO()
第631行:print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime) 改为:print(sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime))
第642行:if not rmap.has_key(cls): 改为:if not cls in rmap:
第766行:uo = o.decode(‘latin-1’) 改为:uo = o
第772行:ue = e.decode(‘latin-1’) 改为:ue = e
②代码如下:
③根据时间生成测试报告名称
time.time():获取当前时间戳。
time.ctime():当前时间的字符串形式。
time.localtime():当前时间的struct_time形式。
time.strftime():用来获得当前时间,可以将时间格式化为字符串。
PYTHON中时间日期格式化符号(区分大小写)如下页所示:

now = time.strftime("%Y-%m-%d %H_%M_%S")
report_path = "C:\\Users\\laohu\\workspace\\pydev_test\\case_piliang\\report\\" + now + "_result.html"
八、自动发送邮件
浙公网安备 33010602011771号