单元测试Unittest
1、什么是单元测试unittest
简介:讲解什么是单元测试,使用场景和unittest介绍
1、单元测试:
是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,
如C语言中单元指一个函数,
function add(int a, int b){
return a + b
}
Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。
总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试
2、unittest 框架是 python的单元测试框架, java -> junit
官网:https://docs.python.org/2/library/unittest.html
3、unnitest = TestCase + TestResult 执行用例 + 结果
2、单元测试框架unittest入门
简介:讲解单元测试框架 unittest的使用
1、用import语句引入unittest模块
2、测试的类都继承于TestCase类
3、setUp() 测试前的初始化工作;tearDown()测试后的清除工作 (在每个测试方法运行时被调用)
注意:
1、所有类中方法的入参为self,定义方法的变量也要“self.变量
2、定义测试用例,以“test”开头命名的方法,方法的入参为self
3、unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们
4、自己写的py文件不能,用 unittest.py 命名,不然会找不到TestCase
成功是输出 . 失败是 F
py开发工具 pycharm
# -*- coding: UTF-8 -*-
import unittest
class UserTestCase(unittest.TestCase):
def tearDown(self):
print("==tearDown==")
def setUp(self):
print("==setUp==")
self.name="小D课堂"
self.age=28
def test_name(self):
print("调用test_name")
#断言是否相同
self.assertEqual(self.name, "小D课堂", msg="名字不对")
def test_isupper(self):
print("调用test_isupper")
#断言是否为 true, msg是断言错误的提示信息
self.assertFalse("xdclass".isupper(), msg="不是大写")
def test_age(self):
print("调用test_age")
self.assertEqual(self.age,28)
if __name__ == '__main__':
unittest.main()
3、测试套件TestSuite介绍
简介:讲解测试套件TestSuite的基本介绍和使用场景
需求:
1、利用unnitest执行流程测试而非单元测试
2、控制unnitest的执行顺序
1、unittest.TestSuite() 类来表示一个测试用例集
1)用来确定测试用例的顺序,哪个先执行哪个后执行
2)如果一个class中有四个test开头的方法,则加载到suite中时则有四个测试用例
3)由TestLoder加载TestCase到TestSuite
4)verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告、2 是详细报告
默认1 会在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”
2、TextTestRunner() 文本测试用例运行器
3、run()方法是运行测试套件的测试用例,入参为suite测试套件
# -*- coding: UTF-8 -*-
import unittest
class XdclassTestCase(unittest.TestCase):
def setUp(self):
self.age = 32
self.name = "小D课堂"
print(" setUp method=======")
def tearDown(self):
print(" tearDown method=======")
#断言是否相同
self.assertEqual('foo'.upper(), 'FOO')
def test_one(self):
print(" test_one 二当家小D 来了")
#断言是否相同
self.assertEqual(self.name, "小D课堂",msg="名字不对")
def test_two(self):
print(" test_two 前端 来了")
#断言是否为 true, msg是断言错误的提示信息
self.assertFalse('XD'.isupper(), msg="不是大写")
def test_three(self):
print(" test_three 后端 来了")
self.assertEqual(self.age,32)
def test_four(self):
print(" test_four 小D课堂官网上线啦 https://www.xdclass.net")
self.assertEqual(self.age,32)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(XdclassTestCase("test_two"))
suite.addTest(XdclassTestCase("test_one"))
suite.addTest(XdclassTestCase("test_three"))
suite.addTest(XdclassTestCase("test_four"))
#verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告(默认)、2 是详细报告
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
4、高级实战系列之测试套件TestSuite生成测试报告
简介:HTMLTestRunner介绍
1、HTMLTestRunner介绍
HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告,无法通过pip安装。
首先要下 HTMLTestRunner.py 文件,将下载的文件放入…\python\Lib目录下 (或者同个路径)
注意点:
python2和python3,语法不一样,导致HTMLTestRunner在python3不兼容
解决办法:导入课程资料里面修改好的HTMLTestRunner.py (该版本是网上的小伙伴修改好的)
4.1 初版测试报告
# -*- coding: UTF-8 -*-
import unittest
import HTMLTestRunner
import time
class XdclassTestCase(unittest.TestCase):
def setUp(self):
self.age = 32
self.name = "小D课堂"
print(" setUp method=======")
def tearDown(self):
print(" tearDown method=======")
#断言是否相同
self.assertEqual('foo'.upper(), 'FOO')
def test_one(self):
print(" test_one 二当家小D 来了")
#断言是否相同
self.assertEqual(self.name, "小D课堂",msg="名字不对")
def test_two(self):
print(" test_two 前端 来了")
#断言是否为 true, msg是断言错误的提示信息
self.assertTrue('XD'.isupper(), msg="不是大写")
def test_three(self):
print(" test_three 后端 来了")
self.assertEqual(self.age,32)
def test_four(self):
print(" test_four 小D课堂官网上线啦 https://www.xdclass.net")
self.assertEqual(self.age,32)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(XdclassTestCase("test_two"))
suite.addTest(XdclassTestCase("test_one"))
suite.addTest(XdclassTestCase("test_three"))
suite.addTest(XdclassTestCase("test_four"))
#verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告(默认)、2 是详细报告
#runner = unittest.TextTestRunner(verbosity=2)
#runner.run(suite)
#文件名中加了当前时间,为了每次生成不同的测试报告
file_prefix = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
print(file_prefix)
#创建测试报告,此时这个文件还是空文件
# wb 以二进制格式打开一个文件,只用于写入,如果文件存在则覆盖,不存在则创建
fp = open("./"+file_prefix+"_result.html","wb")
# stream定义一个测试报告写入的文件,title就是标题,description就是描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"小D课堂 测试报告",description=u"测试用例执行情况")
runner.run(suite)
fp.close()
4.2 测试报告优化
# -*- coding: UTF-8 -*-
import unittest
import HTMLTestRunner
import time
class XdclassTestCase(unittest.TestCase):
def setUp(self):
self.age = 32
self.name = "小D课堂"
print(" setUp method=======")
def tearDown(self):
print(" tearDown method=======")
#断言是否相同
self.assertEqual('foo'.upper(), 'FOO')
def test_one(self):
u"test_one方法"
print(" test_one 二当家小D 来了")
#断言是否相同
self.assertEqual(self.name, "小D课堂",msg="名字不对")
def test_two(self):
u"test_TWO方法说明"
print(" test_two 前端 来了")
#断言是否为 true, msg是断言错误的提示信息
self.assertTrue('XD'.isupper(), msg="不是大写")
def test_three(self):
u"这是首页登录测试用例"
print(" test_three 后端 来了")
self.assertEqual(self.age,32)
def test_four(self):
print(" test_four 小D课堂官网上线啦 https://www.xdclass.net")
self.assertEqual(self.age,32)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(XdclassTestCase("test_two"))
suite.addTest(XdclassTestCase("test_one"))
suite.addTest(XdclassTestCase("test_three"))
suite.addTest(XdclassTestCase("test_four"))
#verbosity参数可以控制执行结果的输出,0 是简单报告、1 是一般报告(默认)、2 是详细报告
#runner = unittest.TextTestRunner(verbosity=2)
#runner.run(suite)
#文件名中加了当前时间,为了每次生成不同的测试报告
file_prefix = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
print(file_prefix)
#创建测试报告,此时这个文件还是空文件
# wb 以二进制格式打开一个文件,只用于写入,如果文件存在则覆盖,不存在则创建
fp = open("./"+file_prefix+"_result.html","wb")
# stream定义一个测试报告写入的文件,title就是标题,description就是描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"小D课堂 测试报告",description=u"测试用例执行情况")
runner.run(suite)
fp.close()