异常处理及测试
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)
以上是关于异常处理及测试的主要内容,如果未能解决你的问题,请参考以下文章