异常处理及测试

Posted shirleysu90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理及测试相关的知识,希望对你有一定的参考价值。

错误异常处理

技术图片

syntax error:语法错误

zero eivision error:语意错误 ,异常类

用try拦截服务异常

try:
x = 5 / 0
print(x)
except:#捕获异常
print(‘程序遇到错误‘)

try:
    x = 5 / 0
    print(x)
except ZeroDivisionError:
    print(‘不能除零‘)
except:
    print(‘其它错误‘)
else:
print(‘没有异常‘)
try:
    x = 5 / 0
    print(x)
except ZeroDivisionError as e: #as e列出异常消息
    print(‘不能除零‘,e)
except:
    print(‘其它错误‘)
else:
    print(‘没有异常‘)

  


 AttibuteError:

 

class Person:
    def __init__(self,name):
        self.name = name

p = Person(‘Peter‘)

try:
    print(p.age)
except AttributeError as e:
    print(‘遇到属性异常‘,e)
finally:#不管前面有没有异常,后面都要处理
f.close()

  测试

main.py

def get_formatted_name(first,last):
    full_name = "{} {}".format(first,last)
    return full_name.title()#把每一个单词第一个字母变大写



#测试
print(get_formatted_name(‘tom‘,‘lee‘))

 

test_name_function.py

import unittest #导入单元测试包
from main import get_formatted_name #导入这个函数

class NameTestCase(unittest.TestCase): #继承基类
    def test_title_name(self):
       formatted_name = get_formatted_name(tom,lee)
       self.assertEqual(formatted_name,"Tom Lee")#判断formattname是否等于tomlee

if __name__ == __main__:
    unittest.main()

AssertionError:断言错误

测试类

class Coder:
    def __init__(self,name):
        self.name = name
        self.skills = []

    def matering_skill(self,skill):
        self.skills.append(skill)

    def show_skills(self):
        print(‘掌握技能:‘)
        for skill in self.skills:
            print(‘-‘,skill)


c = Coder(‘Tom‘)
c.matering_skill("Python")
c.matering_skill(‘C#‘)
c.show_skills()

  

import unittest
from coder import Coder

class CoderTestCase(unittest.TestCase):
    def setUp(self):
        self.c = Coder(‘Tom‘)
        self.c.skills = [‘Python‘,‘.NET‘]

    def test_skill_in(self):

        self.assertIn(‘Python‘,self.c.skills) #判断是否在技能里


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

unittest单元测试概述

技术图片



代码组织

用cmd运行

import unittest #单元测试

def add(a,b):
    return a + b

def subtract(a,b):
    return a - b

class MyTest(unittest.TestCase):#继承基类

    def test_add(self):
        self.assertEqual(8, add(5,3))#测试add结果是否对,断言是否相等

    def test_subtract(self):
        self.assertEqual(2, subtract(5,3))


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

  

断言
判断表达式结果是否相等
import unittest

"""单元测试 断言方法
"""
person = {‘name‘:‘Mike‘,‘age‘:20}
numbers = [1,3,2,88,7,44]
s = ‘优品课堂 codeclassroom.com‘

class TestAssert(unittest.TestCase):
    def test_assert_methond(self):
        self.assertEqual(‘Mike‘,person.get(‘name‘))#从字典表获取键值
        pass

if __name__ == ‘__main__‘:
    unittest.main()
返回Ture false
import unittest

"""单元测试 断言方法
"""
person = {‘name‘:‘Mike‘,‘age‘:20}
numbers = [1,3,2,88,7,44]
s = ‘优品课堂 codeclassroom.com‘

class TestAssert(unittest.TestCase):
    def test_assert_methond(self):
        #self.assertEqual(‘mike‘,person.get(‘name‘))#从字典表获取键值
        self.assertTrue(‘优品课堂‘ in s)

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

import unittest

"""单元测试 断言方法
"""
person = {‘name‘:‘Mike‘,‘age‘:20}
numbers = [1,3,2,88,7,44]
s = ‘优品课堂 codeclassroom.com‘

class TestAssert(unittest.TestCase):
    def test_assert_methond(self):
        #self.assertEqual(‘mike‘,person.get(‘name‘))#从字典表获取键值
        #self.assertTrue(‘优品课堂‘ in s)
        self.assertIn(‘优品课堂‘,s)

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

 类与测试装置

#self.assertEqual(‘mike‘,person.get(‘name‘))#从字典表获取键值
#self.assertTrue(‘优品课堂‘ in s)
#self.assertIn(‘优品课堂‘,s)
#self.assertAlmostEqual(3.3,1.1 + 2.2)
#self.assertIs(True + 1, 2)
#self.assertIsNone(person.get(‘Name‘, None))
#self.assertIsNone(numbers[0],int)
self.assertGreater(7, numbers[0])
创建一个calculator.py
"""计算器
"""

class Calculator:
    def __init__(self,x,y):
        self.x = x
        self.y = y

    def add(self):
        return self.x + self.y

    def subtract(self):
        return self.x - self.y

if __name__ == ‘__main__‘:
    c = Calculator(5,3)
    print(c.add())

创建一个test文件夹,里面放入calculator_test.py
import unittest
from calculator import Calculator
"""Code Description
"""

class CalculatorTest(unittest.TestCase):
    def setUp(self):
        self.c = Calculator(5,3)


    def test_add(self):
        #c = Calculator(5,3)
        self.assertEqual(8,self.c.add())

    def test_subtract(self):
        #c = Calculator(8,4)
        self.assertEqual(4,self.c.subtract())

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

 

 

技术图片


技术图片




小数格式化、取证与四舍五入
>>>‘数值:{}.format(a)‘
>>>f‘数值:{a}‘#同上
b = 1234567890.123456
f‘数值:{b}‘
Out[3]: ‘数值:1234567890.123456‘
f‘数值:{b:f}‘
Out[4]: ‘数值:1234567890.123456‘
f‘数值:{b:,f}‘
Out[5]: ‘数值:1,234,567,890.123456‘
f‘数值:{b:,.2f}‘
Out[6]: ‘数值:1,234,567,890.12

b = 1234567890.123456
f‘数值:{b}‘
Out[3]: ‘数值:1234567890.123456‘
f‘数值:{b:f}‘
Out[4]: ‘数值:1234567890.123456‘
f‘数值:{b:,f}‘
Out[5]: ‘数值:1,234,567,890.123456‘
f‘数值:{b:,.2f}‘
Out[6]: ‘数值:1,234,567,890.12


ceil:向上取整
floor:向下取整
round:四舍五入
trunc:对值进行截断

random随机处理

生成随机浮点数或小数

1、#生成0-1之间的浮点数

import random
rnd = random.random()
print(rnd)

返回

0.4116634571675989

2、#生成0-1之间的浮点数,2位精度

rnd = round(random.random(),2)
print(rnd)

返回

0.86

3、#生成[1,100]之间的浮点数;

rnd = random.uniform(1, 100)
print(rnd)

返回

40.46081911647691

4、#生成[1,100]之间的浮点数,2位精度

rnd = round(random.uniform(1, 100),2)
print(rnd)

返回

81.31

 

生成整数、奇数、偶数

1、#生成[1,100]之间的整数

rnd = random.randint(1, 100)
print(rnd)

返回

79

2、#生成[1,100]之间的整数,加百分号

rnd = str(random.randint(1, 100)) + "%"
print(rnd)

返回

87%


3、#生成[1,100]之间的奇数

rnd = random.randrange(1, 100, 2)
print(rnd)

返回

93

4、#生成[2,100]之间的偶数

rnd = random.randrange(2, 100, 2)
print(rnd)

返回

26

 

序列中随机取元素

#从序列中随机取一个元素
rnd = random.choice([‘剪刀‘, ‘石头‘, ‘布‘])
print(rnd)

返回

剪刀

 

生成随机字符串

#生成字母数字组成的32位密钥,来源 比特量化
rnd = ‘‘.join(random.sample(‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘,32))
print(rnd)

返回

43bFuQln6fkGjmH1OCE9aweLz08WTsIA


扑克洗牌

poker = [‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘10‘,‘J‘,‘Q‘,‘K‘,‘A‘]
random.shuffle(poker)
print(poker)

返回

[‘9‘, ‘A‘, ‘10‘, ‘K‘, ‘Q‘, ‘3‘, ‘6‘, ‘J‘, ‘4‘, ‘7‘, ‘5‘, ‘8‘, ‘2‘]





日期与时间常用操作
模块:
time:time是一个仅包含与日期和时间相关的函数和常量的模块,在本模块中定义了C/C++编写的几个类。例如,struct_time类
datetime:datetime是一个使用面向对象编程设计的模块,可以在Python中使用日期和时间。它定义了几个表示日期和时间的类
calendar:日历是一个提供函数的模块,以及与Calendar相关的几个类,它们支持将日历映像生成为text,html,….
locale:该模块包含用于格式化或基于区域设置分析日期和时间的函数。

时间字符串支持的格式符号:
 1 格式  含义  备注
 2 %a  本地(locale)简化星期名称
 3 %A  本地完整星期名称
 4 %b  本地简化月份名称
 5 %B  本地完整月份名称
 6 %c  本地相应的日期和时间表示
 7 %d  一个月中的第几天(01 - 31)
 8 %H  一天中的第几个小时(24小时制,00 - 23)
 9 %I  第几个小时(12小时制,01 - 12)
10 %j  一年中的第几天(001 - 366)
11 %m  月份(01 - 12)
12 %M  分钟数(00 - 59)
13 %p  本地am或者pm的相应符
14 %S  秒(01 - 61)
15 %U  一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
16 %w  一个星期中的第几天(0 - 6,0是星期天)
17 %W  和%U基本相同,不同的是%W以星期一为一个星期的开始。
18 %x  本地相应日期
19 %X  本地相应时间
20 %y  去掉世纪的年份(00 – 99)
21 %Y  完整的年份
22 %Z  时区的名字(如果不存在为空字符)
23 %%  ‘%’字符

 1 import time
 2  
 3 ticks = time.time()
 4  
 5 # 这种格式不能表示在时代(1970年1月1日上午12:00)之前的日期。只能表示之后日期并且截止点为3038年的某个时刻,在未来的日子也不能以这种方式表示
 6 print("Number of ticks since 12:00am, January 1, 1970:", ticks)
 7  
 8 # 获取当前本地时间
 9 localtime =time.localtime(time.time())
10 print("Local current time :", localtime)
11 
12 # 当前时间格式化
13 curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
14 print(curtime)
15 # 也可以使用asctime()进行时间格式化
16 print(time.asctime(localtime))

datetime模块使用:
from datetime import date
from datetime import datetime
from datetime import timedelta
 
# 计算两个日期相差多少天
d1 = date(2018, 10, 18);
d2 = date(2017, 12, 31);
 
print("(2018, 10, 18)与(2017, 12, 31)相差:", (d1 - d2).days, "天!");
 
# 获取两个日期时间的时间差
time1 = datetime(2019, 1, 13, 12, 0, 0);
time2 = datetime.now();
differtime = (time1 -time2).total_seconds();
print("(2019,1,13,12,0,0)与当前时间相差:", differtime, "秒!");# 输出结果
  
# 当前日期
curdate = date.today();
print("curdate =",curdate);
  
# 计算十天之后的日期时间
nowday = datetime.now();
# timedelta类可以很容易地算出前几天和后几天的时刻。(timedelta(days= d, hours= h))
# 还可以查看第几周对应的时间,例如:timedelta(weeks=20) 20周将被自动转化为天数
# 前几天时刻,用减法。  后几天时刻,则用当前时间加上timedelta(days = d, hours= h)
lastday = nowday + timedelta(days=10);
print(str(lastday));
print(lastday.ctime());# ctime()  返回一个表示日期和时间的字符串。
  
# 查看某一天是今年的第几天和第几周
testday = date(2017, 8, 31);
print(testday.isocalendar());# isocalendar() 函数返回三元组    分别为:年份,周数,周几
print(testday.timetuple());# timetuple()  返回时间元祖

timedelta

In [158]: now - timedelta(seconds=1)
Out[158]: datetime.datetime(2016, 4, 23, 16, 32, 59, 143269)
In [159]: now - timedelta(seconds=1)
Out[159]: datetime.datetime(2016, 4, 23, 16, 32, 59, 143269)
In [160]: now - timedelta(hours=1)
Out[160]: datetime.datetime(2016, 4, 23, 15, 33, 0, 143269)
In [161]: now - timedelta(days=1)
Out[161]: datetime.datetime(2016, 4, 22, 16, 33, 0, 143269)
In [162]: now - timedelta(minutes=1)
Out[162]: datetime.datetime(2016, 4, 23, 16, 32, 0, 143269)

 
























以上是关于异常处理及测试的主要内容,如果未能解决你的问题,请参考以下文章

异常和TCP通讯

异常处理及测试

25 Python - 异常处理及测试

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

项目架构开发:异常处理及日志

Java Geometry计算轨迹与围栏交集效率测试及异常处理