单元测试测试之unittest

首先我们先理解单元测试是谁做的 —>开发
然后我们测试会写代码之后,我们也可以自己做单元测试

那么单元测试是做什么? --> 对某个功能去测试
单元测试测试什么? -->类里面的方法
单元测试怎么测? -->创建对象 — 调用方法 —传参 -->通过传递多组数据来测试不同的情况

单元测试的框架有 unittest 和 pytest
学会了unittest才好学pytest,跳过了unittest去学pytest的话有点难学

我们先了解下unittest:
unittest最核心的四个概念test case,test suite,test runner,test fixture,看图
单元测试测试之unittest
TestCase -->这个模块是用来编写测试用例
TestSuite -->这个模块是测试用例收集器,是用来收集TestCase里的测试用例
TestLoader -->加载用例,可以从TestCase加载用例,也可以从TestSuite加载用例
runner里的TextTestResult和TextTestRunner是用来运行测试用例
result里的TestResult是用来出测试报告

所以我们的单元测试是先编写用例(case)–>收集用例(suite)–>加载用例(loader)–>运行用例(runner)–>出测试报告(result)

我们先创建一个被测试的模块名为bei_uinttest,其次创建类和方法

#先创建要单元测试的类和被测试的方法
class My_unttis:
    def add_jiafa(self,a,b):
        return a+b
    def add_jianfa(self,a,b):
        return a-b

2.我们创建一个danyuan_unittest模块名来编写用例
2.1导入 unittest模块 和 要编写的用例,然后使用断言来查看
断言图:一般用assertEqual()和assertisNone()用的比较多
单元测试测试之unittest

#先导入内置类,再导入被测试的类,这里是编写用例
import unittest
from python.bei_unittest import My_unttis

class TestAdd(unittest.TestCase): #继承unittest模块里的TestCase类


    #所有的测试用例都要以test开头,否则运行不了
    def test_add_jiafa(self):
        print('test_add_jiafa')
        exp = 5 #设置我们的期望值
        res=My_unttis().add_jiafa(2,3)  #实际值
        self.assertEqual(exp,res)  #使用断言


    def test_add_jianfa(self):
        print('test_add_jianfa')
        exp = 5
        res = My_unttis().add_jianfa(10,5)
        self.assertEqual(exp,res)

输出:
单元测试测试之unittest
2.2 注:鼠标右键在类名或 空白格 就执行全部用例,在方法名右键执行只会执行右键执行的一条
用例的执行顺序是根据ascll 编码来执行
单元测试测试之unittest

3.我们创建一个用例执行器来执行测试用例
 创建一个test_yongli模块,导入测试用例

import unittest
from python.danyuan_unittest import TestAdd
from python import danyuan_unittest
import HTMLTestRunnerCN #网页生成报告


#存储用例的容器suite 套件
'''这里是执行用例,执行用例有三种方法'''
suite=unittest.TestSuite() #创建一个对象


#第一种方法,一个个的去添加
# suite.addTest(TestAdd('test_add_jiafa'))
# suite.addTest(TestAdd('test_add_jianfa'))


#第二种方法  通过loader来加载用例  通过模块来加载用例,这里是全部运行
#一般用这种方法比较多
# loader=unittest.TestLoader()  #用例加载器
# suite.addTest(loader.loadTestsFromModule(danyuan_unittest)) #这里的括号是模块名,不是类名


#第三种 通过loader来加载用例  通过测试类名来加载用例
loader=unittest.TestLoader() #用例加载器
suite.addTest(loader.loadTestsFromTestCase(TestAdd))


#执行用例生成text报告
#执行用例,生成报告,python最原始报告
# with open('test.txt','w') as file:
#     runner=unittest.TextTestRunner(stream=file,verbosity=2)#创建一个对象来执行用例
#     runner.run(suite)

#生成httml报告,HTMLTestRunner文件网上找哈
with open('test.html','wb') as file:
    runner=HTMLTestRunnerCN.HTMLTestReportCN(
        stream=file,
        verbosity=2, #生成的精确度
        title='测试报告', #标题
        description='用例', #描述
        tester='王小贱' #测试人员名字
    )#创建一个对象来执行用例
    runner.run(suite)

注:verbosity 有3个等级,0是最低,1是仔细,2是最准确
输出:
单元测试测试之unittest
python 原始.txt测试报告:
单元测试测试之unittest
网页生成的报告:
单元测试测试之unittest

3.1注:我们看到运行结果有…,这两个.是什么意思呢?
    . 是通过一条用例,假如有100条测试用例,那么就有100个.
    E 代码出错
    F 用例执行失败