单元测试:
单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义
如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以指一个窗口或者一个菜单等等,总的来说,单元就是人为规定的最小的被测功能模块

单元测试框架:
在单元测试框架出现之前,开发人员在创建可执行测试时饱受折磨,最初的做法是在应用程序中创建一个窗口,配有“测试控制工具”他只是一个窗口,每个测试
对应一个按钮,这些测试的结果要么是一个消息框,要么是直接在窗口本身给出某种显示结果,由于每个测试都需要一个
按钮,所以这些窗口变的非常的拥挤,不可管理;

单元测试框架提供了一种统一的编程模型,可以将测试定义为一些简单的类,这些类中的方法可以调用希望测试的应用程序代码,开发人员
不需要编写自己的测试控制工具,单元测试框架提供了测试运行程序,只需要单击按钮就可以执行所有测试,利用单元测试框架,可以很轻松的插入,设置和
分解有关测试的功能,测试失败时,测试运行程序可以提供有关失败的信息,包含任何可供利用的一场信息和堆栈跟踪,不同编程
语言有不同的单元测试框架,如,java的Junit,TestNg,c#的Nunit ,python的unittest,testtoolssubunit....

单元测试框架的作用:

提供用例组织与执行
提供丰富的断言方法
提供丰富的日志与测试结果

Python的单元测试框架---unittest
unittest单元测试框架不仅仅可以适用于单元测试,还可以适用web自动化测试用例的开发与执行
该测试框架可组织执行测试用例,并且提供了丰富的断言的方法,判断测试用例是否通过,最终声场测试结果

unittest的核心要素:
1.TestCase
一个TestCase的实例就是一个测试用例,什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的准备(setUp)
执行测试代码(run)以及测试后环境的还原(tearDown),单元测试(unittest)的本质就在这里,一个测试用例是一个完整的测试单元
通过运行这个测试单元,可以对某一个问题进行验证;

TestSuite
而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite,TestLoader是用来加载测试用例到TestSuite中的

TextTestRunner
TextTestRunner是用来执行测试用例的,其中的runn()会执行,TestSuite/TestCase中的run(result)方法,测试的结果会保存到TextTestResult
实例中,,包括运行了多少测试用例,成功了多少,失败了多少等等信息

Fixture
而对于一个测试用例环境的搭建和销毁,是一个fixture

二:unittest案例
建立一个:calculator.py文件,然后
构造一个类Math包含整数加法运算

class Math:
def __init__(self,a,b):
self.a=int(a)
self.b=int(b)
def add(self):
return self.a+self.b

然后在构建一个测试文件testMath.py
用来测试刚刚构建的类

 from calculator import Math
import unittest
class testMath(unittest.TestCase):
def setUp(self):
print("start test")
def test_add(self):
j=Math(,)
#用到断言,后边还会讲解,
self.assertEqual(j.add(),)
#失败的场景
#self.assertEqual(j.add(),)
def tearDown(self):
print("test end")
if __name__ == '__main__':
#构建测试集
suite=unittest.TestSuite()
suite.addTest(testMath("test_add")) #执行测试:
runner=unittest.TextTestRunner()
runner.run(suite)

注意当导入文件报错的时候:

可以选择,如图:

这样就不会因为导入文件找不到而报错了;

上述测试的结果为:

三:常用的断言的方法:

断言内容是自动化脚本的重要的内容,正确设置断言以后才能帮助我们判断测试用例执行的结果;

断言的方法:
assertEqual(a,b) 判断a==b
assertNotEqual(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) is None
assertisNotNone(x) x is not None
assertin(a,b) a in b
assertNotin(a,b) a not in b
assertisinstance(a,b) isinstance(a,b)
assertNotinstance(a,b) not isinstance(a,b)

通过上述的加法的离例子,来运行修改上述的代码,运行上述的断言的方法:

这里不在赘述,大家可以通过例子查看;

四:新增的单元测试用例的管理:

前面是针对一个add方法来进行单元测试的,如果需要多个方法进行测试,该如何处理?如新增一个Sub方法来进行单元测试

在上述的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_sub
在这里面定义一些减法的用例:
在调试的时候在main函数里面多加两条case的调试就好了:
 from calculator import Math
import unittest
class testMath(unittest.TestCase):
def setUp(self):
print("start test")
def test_add(self):
j=Math(,)
#用到断言,后边还会讲解,
self.assertEqual(j.add(),)
#失败的场景
#self.assertEqual(j.add(),)
def test_add1(self):
j=Math(,)
self.assertEqual(j.add(),) def tearDown(self):
print("test end")
class Test_sub(unittest.TestCase):
def setUp(self):
print("start test2") def test_sub1(self):
k=Math(,)
self.assertEqual(k.sub(),) def tearDown(self):
print("test end2") if __name__ == '__main__':
#构建测试集
suite=unittest.TestSuite()
suite.addTest(testMath("test_add"))
suite.addTest(testMath("test_add1"))
suite.addTest(Test_sub("test_sub1")) #执行测试:
runner=unittest.TextTestRunner()
runner.run(suite)

执行结果如图:

五:用例合并:

用例公共部分的合并:
上一节课内容中,每个测试类都有setUP() 和tearDown()
而且连个方法的内容都是一样的,用于打印开始与结束提示语句,是否可以合并在一起呢?

要合并:两个类里面的:setUP() 和tearDown()必须一致才能合并,不一致是不能喝并的

 from calculator import Math
import unittest class tearupend(unittest.TestCase):
def setUp(self):
print("start test")
def tearDown(self):
print("test end2") class testMath(tearupend): def test_add(self):
j=Math(,)
#用到断言,后边还会讲解,
self.assertEqual(j.add(),)
#失败的场景
#self.assertEqual(j.add(),)
def test_add1(self):
j=Math(,)
self.assertEqual(j.add(),) class Test_sub(tearupend):
def test_sub1(self):
k=Math(,)
self.assertEqual(k.sub(),) if __name__ == '__main__':
unittest.main

在上述类的继承上:

tearupend 继承了unittest.TestCase
其他的类都继承了:tearupend

六用例综合框架管理:
前面的测试用例与执行都是写在一个文本,当用例数量不断增加的时候,用例的执行与管理变得非常麻烦,因此需要对用例根据具体的功能模块来
使用单独的模块化管理,就像一所学校要根据不同的年级进行分班管理,也是一样的道理(这里代码不在一一赘述,大家自行完成)

案例 TestProject文件目录里面包含5个文件:
1、StartEnd.py ----------setup,teardown的管理文件
2、calculator.py----------加减法运算方法的实现
3、test_add.py------------加法测试用例
4、test_Sub.py------------减法测试用例
5、runtest.py--------------用例执行管理

runtest要这样写
./是指当前的路径

七:测试报告:

自动化测试执行完成之后,我们需要生成测试报告,生成HTML的一个测试报告,

来查看测试结果,使用HTMLTestRunner模块可以直接生成HTML格式的报告

下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html

下载完成之后要对其文件进行修改:(因为下载的模块是对应的是Python2编写的,如果使用的是Python3,则需要对这个文件进行修改)

存放路径:
修改完成的模块放在Python路径下的Lib目录里面既可;

这里我已经修改好了,大家可以直接下载:

链接: https://pan.baidu.com/s/1kU7Go4J 密码: 4jc3

单元测试框架unittest的更多相关文章

  1. Python单元测试框架unittest使用方法讲解

    这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下   概 ...

  2. Python单元测试框架unittest之深入学习

    前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test c ...

  3. Python单元测试框架unittest之单用例管理(一)

    一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...

  4. python之使用单元测试框架unittest执行自动化测试

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 单元测试框架即一堆工具的集合. 在说unittest ...

  5. Python单元测试框架unittest

    学习接口自动化测试时接触了unittest单元测试框架,学习时参照了虫师编写的<selenium2自动化测试实战>,个人觉得里面讲的例子还比较容易理解的. 一.基础 1.main()和框架 ...

  6. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库——unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  7. Appium+python的单元测试框架unittest(1)(转)

    unittest为python语言自带的单元测试框架,python把unittest封装为一个标准模块封装在python开发包中.unittest中常用的类有:unittest.TestCase.un ...

  8. Appium+python的单元测试框架unittest(4)——断言(转)

    (原文:https://www.cnblogs.com/fancy0158/p/10051576.html) 在我们编写的测试用例中,测试步骤和预期结果是必不可少的.当我们运行测试用例时,得到一个运行 ...

  9. python单元测试框架-unittest(一)

    简介 unittest单元测试框架不仅可以适用于单元测试,还可以使用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. ...

随机推荐

  1. Git工作流基础简介【与产品经理.jpg】

    基于可视化界面的操作可使用Sourcetree这个软件进行操作. 下面将描绘的几个命令主要是 git init git add git commit git status git reset HEAD ...

  2. samba配置中常见错误收集.txt

    在命令行输入命令: ~$ smbclient -L \\127.0.0.1按要求输入密码后,提示出错:session setup failed: NT_STATUS_LOGON_FAILURE 这是因 ...

  3. WebForm(内置函数)

    Response - 响应对象1.定义:Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应.若指定的cookie不存在,则创建它.若存在,则将自动进行更新.结果返回给客 ...

  4. Android开发中常见的设计模式(二)——Builder模式

    了解了单例模式,接下来介绍另一个常见的模式--Builder模式. 那么什么是Builder模式呢.通过搜索,会发现大部分网上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ...

  5. python Requests库网络爬取IP地址归属地的自动查询

    #IP地址查询全代码import requestsurl = "http://m.ip138.com/ip.asp?ip="try: r = requests.get(url + ...

  6. git 出现冲突时的解决办法

    <一> 二者兼得最麻烦 1, 出现冲突一般出现在群体开发两个及以上开发者同时修改同一个文件时 2, 具体表现为 git pull , git push 和 git commit 命令执行失 ...

  7. kubernetes国内镜像拉取

    因国内访问不到goole服务器,只能拉取国内的镜像,这里以阿里云为例. 安装minikube时报failed to pull image "k8s.gcr.io/kube-apiserver ...

  8. unrecognized import path "golang.org/x/net/html"

    go run的时候报:unrecognized import path "golang.org/x/net/html" 应该是被墙掉了,自己去github上下载包即可 git cl ...

  9. Linux MySQL 安装、远程访问和密码重置

    安装: yum install mysql yum install mysql-server yum install mysql-devel 设置开机启动: chkconfig -add mysqld ...

  10. UICollectionView setPrefetchingEnabled

    UICollectionView 开启是否开启预加载,如果开启,cell在没显示的时候就回去调用cellForIndex…方法,如果没开启,cell只有在显示的时候才会去调用cellForIndex… ...