知识点总结:
- 异常处理
- 单元测试
- f格式化
- 日期操作
异常处理
- 异常处理代码组织
try:
'''
code block
'''
# 通过except捕获指定异常,通过as对error增加引用
except AttributeError as e:
print('AttributeError is catch', e)
# 通过except捕获未被指定处理的异常
except:
# 通过raise手动抛个异常
raise RuntimeError()
# 通过else执行未出现异常的情况
else:
print('no error')
# 通过finally最终都会执行部分
finally:
print('finally body is calling')
单元测试
引用自: https://medium.com/swlh/introduction-to-unit-testing-in-python-using-unittest-framework-6faa06cc3ee1
-
动手写
test case
-
测试类需要继承
unittest.TestCase
-
直接声明方法即为单元测试方法
-
可以声明多个测试方法(在一个
test case
中)
-
注意命名规范
-
However, using “test_” increases the readability of the code and also conforms to the PEP — 8 : Style Guide for Python Code
-
可以定义多个测试类在一个模块中,尽可能的明确用途(见名知义)
-
可以在不同类中声明相同的测试方法名
How to write Unit Tests (The AAA Model)
All unit tests must be written using AAA model where AAA expands to Arrange, Act & Assert. Here is what is meant by it
- Arrange → Setting up of all the prerequisites required for the test to run
- Act → Run the actual code under test
- Assert → Verify whether the code is indeed running as expected
Example of a AAA Unit Test
Let’s assume that we have a sum(a,b) function defined as
-
在
test_sumtest()
测试我们的sum方法,声明a, b
作为参数传入北侧方法sum()
,将返回值result
作为断言的参数。看起来没毛病是不是,可是当我们再加一个测试方法test_sumtest_rev()
的时候还要在写一遍a, b
,太累了于是乎👇
-
于是将所需的初始值(初始资源创建)放在
setUp()
中。执行用例时,由测试框架调用完成初始化,无需自己写代码初始化。
-
有初始化方法就会有对应的销毁方法
tearDown()
数值处理
>>> a = 222
# PY3以f开头字符串代表format
>>> f'数值:{a}'
'数值:222'
# f代表浮点数
>>> '数值:{:f}'.format(a)
'数值:222.000000'
# f开头写法,功能同上
>>> f'数值:{a:f}'
'数值:222.000000'
# 带正负号
>>> f'数值:{a:+f}'
'数值:+222.000000'
# 声明浮点型
>>> b = 100121234.445512344
# 用,分割高位
>>> f'数值:{b:,f}'
'数值:100,121,234.445512'
# 保留3位小数(四舍五入)
>>> f'数值:{b:.3f}'
'数值:100121234.446'
>>> x = 18
>>> y = 23
# 保留两位小数
>>> '{:.2f}'.format(x/y)
'0.78'
# 百分号形式显示
>>> '{:.2%}'.format(x/y)
'78.26%'
日期时间
>>> import datetime
# 最大年
>>> datetime.MAXYEAR
9999
# 最小年
>>> datetime.MINYEAR
1
# 获取今天
>>> today = datetime.date.today()
>>> today
datetime.date(2019, 11, 26)
>>> type(today)
<class 'datetime.date'>
>>> today.year
2019
>>> today.month
11
>>> today.day
26
# 星期从 0-6
>>> today.weekday()
1
>>> today.isoweekday()
2
# 指定日期
>>> birthday = datetime.date(1883, 3, 12)
>>> birthday.year
1883
>>> birthday.month
3
>>> birthday.day
12
# 指定时间
>>> t = datetime.time(12, 46, 32)
>>> type(t)
<class 'datetime.time'>
>>> t.hour
12
>>> t.minute
46
>>> t.second
32
# 获取当前日期时间
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2019, 11, 26, 23, 5, 57, 945577)
# string类型
>>> s = '2018-3-15'
>>> type(s)
<class 'str'>
# string转换为datetime
>>> t = datetime.datetime.strptime(s,'%Y-%m-%d')
>>> t
datetime.datetime(2018, 3, 15, 0, 0)
>>> now
datetime.datetime(2019, 11, 26, 23, 5, 57, 945577)
>>> type(t)
<class 'datetime.datetime'>
# datetime转为string
>>> str_now = now.strftime('%Y/%m/%d')
>>> str_now
'2019/11/26'
- 时间操作
>>> now
datetime.datetime(2019, 11, 26, 23, 5, 57, 945577)
>>> birthday = datetime.datetime(1949, 10, 1, 6, 30, 00)
# 时间差
>>> diff = now - birthday
>>> diff
# datetime.timedelta(days, seconds, microseconds)
datetime.timedelta(25623, 59757, 945577)
>>> diff.days
25623
>>> diff.seconds
59757
# 全秒差值
>>> diff.total_seconds()
2213886957.945577
# 指定days日期加
>>> now + datetime.timedelta(days=100)
datetime.datetime(2020, 3, 5, 23, 5, 57, 945577)
# 日期减
>>> now - datetime.timedelta(days=100)
datetime.datetime(2019, 8, 18, 23, 5, 57, 945577)
# 指定seconds日期加
>>> now + datetime.timedelta(seconds=3000)
datetime.datetime(2019, 11, 26, 23, 55, 57, 945577)