ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

断言和简单unittest单元测试的入门代码整理

2020-05-08 14:59:10  阅读:224  来源: 互联网

标签:__ 入门 unittest 单元测试 split test self 断言


一、单元测试的含义

unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试、为测试共享setUp和shutDown、它可以在将测试用例聚合到一起形成一个集合一起执行的同时在测试报告中展示独立的测试结果。

为了达到此目的,unittest支持几个重要的面向对象式的概念:

1、test fixture

  一个test fixture所做的事情是执行单个或多个测试用例时的准备工作和执行结束后的一些相关清理工作,这包括:创建临时或代理数据库、目录或开始服务器进程。。。

2、test case

  一个test case 是一个独立的测试单元,针对于一组特定的输入得到的特殊相应的验证,通过继承unittest提供的基类TestCase, 然后可以创建新的测试用例

3、test suite

  一个test suite 是一组测试用例的集合,也可以是一组test suite的集合,也可以两者混合的集合,test suite就是用来聚合你想要一起执行的测试用例的

4、test runner

  一个test runner 是一个协调测试执行并向用户提供执行结果的组建,它可以使用图形界面、文本界面或返回一个特殊值标识测试执行的结果

二、实例代码

下面我们看Python官方给的一个简单的小例子,来测试三个字符串

import unittest

class TestStringMethods(unittest.TestCase):  # 测试类继承了unittest.TestCase类,因此在该类里可以创建新的测试用例

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')  # ‘foo’是一个字符串,upper()方法会将这个字符串转成大写,assertEqual是unittest提供的一个断言方法,用来比较逗号前后两个值是否相等

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())  # assertTrue也是unittest提供的断言方法,用来判断括号内的内容是真是假,如果是真则断言成功,否则为失败,'FOO'是个字符串并且是大写,调用isupper()方法,返回结果
        self.assertFalse('Foo'.isupper())  # assertFalse则正好相反,如果括号内返回为假则断言成功,否则为失败

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

三、代码解析:

在第三个用例里,定义了一个字符串,s='hello world', 然后进行了断言,断言的条件里调用了一个split()方法,实际上初学者看到这会比较懵,s.split()到底返回的是什么,它是否等于逗号后边['hello', 'world']?

学这个东西就是要多试试,那么接下来我们进行一系列尝试来认识一下split()

启动命令行CMD,进入python环境

尝试1:定义一个字符串  s = 'hello world', 然后 print(s)回车,结果应该是  hello world

尝试2:如果我们敲入print(s.split())然后回车呢呢,结果应该是['hello', 'world'], 到此我们就得到了答案,第三条用例里的断言self.assertEqual(s.split(), ['hello', 'world'])是成功

尝试3:如果我们print(s.split(2)) 会是什么结果?  如果我们print(s.split('o'))又会是什么结果?

        with self.assertRaises(TypeError):
            s.split(2)

在第三个用例里,我们也看到了两行代码,split()函数我们已经知道它能干什么了,那么with是什么?assertRaises在这又在干什么?

with,我们总提python之美,那么这就是美丽之处,with语句提供一个有效的处理异常和完成清理工作的机制,它让代码更简练,有点懵没关系,换一个方式说,如果不用with,要达到同等效果的的话要用什么呢?try...except...finally,这是另一个课题了并不是此处的重点,读者朋友可以先忽略它不要打断学习unittest的思路

assertRaises是什么呢?unittest 模块提供了用于测试函数是否在给定无效输入时引发特定异常的方法,这个方法就是assertRaises,我们在回去看代码,s.split(2), 很明显我们前边已经尝试过执行参数为2的情况,报了异常,也就是2并不是split函数的合法参数,我们传给2这个参数,它理应报异常,那么好with self.assertRaises(TypeError): 在干什么,它想要的就是看看split()在得到了非法参数的时候是否报一个TypeError,此处读者可能要整理一下思路,仔细阅读此段内容

最后的unittest.main(),有了它我们就有了一个简单的方式执行这个脚本,unittest.main()提供了命令行界面运行脚本的方式

假设我们上边的脚本保存在文件testingunit.py里并将它保存在桌面,然后我们启动命令行,输入“python C:\Users\davieyang\Desktop\testingunit.py”  看看是个什么结果?

C:\Users\用户名>python C:\Users\davieyang\Desktop\testingunit.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

我们能看到4个....,它的意义我们共4个用例,点表示测试通过,那么如果点表示测试通过,什么表示测试失败呢? 是“F”,如果测试遇到异常呢? 是“E”

如果我们执行“python C:\Users\davieyang\Desktop\testingunit.py -v”又是什么结果?

C:\Users\用户名>python C:\Users\davieyang\Desktop\testingunit.py -v
test_isupper (__main__.TestStringMethods) ... ok
test_list (__main__.TestStringMethods) ... ok
test_split (__main__.TestStringMethods) ... ok
test_upper (__main__.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 4 tests in 0.002s

OK

 

断言和简单unittest单元测试的入门代码整理

'''
1.认识Assert 断言
断言的比较运算符号:assert可以使用比较运算:”==” “!=” ‘’<” “>” “>=” “<=”等符号来比较相等、不相等、小于、大于、大于等于和小于等于。

Assert 语法格式:
assert 1 ==1
assert 2+2 ==2*2
断言的作用:
1.检查文档
2.具有一定的判断的效果
3.防御性的编程


使用方法:
assertEqual(first,second,msg)其中first与second 进行比较,如果相等则通过;msg为失败的信息,选填。 断言assertNotEqual反正用就可以。
1.assertTrue 和 assertFalse
assertTrue :判断bool值为True,则pass
assertFalse: 判断bool值为False,则pass
'''
# assert 8>5,"not Ture" #正确没有任何操作
# assert 3>5,"not Ture" #错误抛出异常

'''
a="this is a string"
assert type(a)== int,"类型不一致"
assert type(a)== str,"类型不一致"

当断言正确的时候,不会输出,
反之错误,则输出异常信息
'''

 


'''
try...except:
用来引发异常

try:
print("请输入一个整数")
a=int(input())
print('值是:',a)
except:
print("您输入有误,请重新输入")
'''
# if 条件判断 TRUE执行 错误 else语句

'''
错误,异常,断言区别:
错误:代码运行前的语法或者逻辑错误,语法错误在执行前修改,逻辑错误无法修改
异常:
1.异常产生:检查到错误且解释器认为是异常,抛出异常
2.异常处理:截取异常,或略或者终止处理异常
3.断言:就是拿实际的结果和预期的结果相互比较,断言就是比的过程

 

'''

 

import unittest #导入单元测试框架

 

class TestStringMethods(unittest.TestCase):

   '''

   继承unittest下的TestCase

   

   测试用例(testCase):是为了某个特殊目标而编制的一组测试输入,

   执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。

 

   使用名称以字母开头的方法定义三个单独的测试 test。

   此命名约定通知测试运行器哪些方法代表测试。

 

 

 

      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 3.1

      assertIsNot(a, b) a is not b

      assertIsNone(x) x is None

      assertIsNotNone(x) x is not None

      assertIn(a, b) a in b 3.1

      assertNotIn(a, b) a not in b

      assertIsInstance(a, b) isinstance(a, b)

      assertNotIsInstance(a, b) not isinstance(a, b)

   

   '''

 

    def test_upper(self):

       #定义一个以test开头的方法会自动调用

       #断言'foo'.upper() == 'FOO'

        self.assertEqual('foo'.upper(), 'FOO')

 

         

    def test_isupper(self):

       #断言'FOO'全部是大写 是真的

        self.assertTrue('FOO'.isupper())

       #断言'Foo'全部是大写是假的

        self.assertFalse('Foo'.isupper())

 

    def test_split(self):

        s = 'hello world'

        #断言s.split()的结果与['hello', 'world']相等

        self.assertEqual(s.split(), ['hello', 'world'])

        # check that s.split fails when the separator is not a string

         #检查。当分隔的不是字符串时,split失败 断言一个类型错误异常

        with self.assertRaises(TypeError):

            s.split(2)

 

if __name__ == '__main__':

    unittest.main()

标签:__,入门,unittest,单元测试,split,test,self,断言
来源: https://www.cnblogs.com/bashliuhe/p/12850448.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有