前言
单元测试的目的是保证函数的健壮性,所以需要对要测试的函数进行边界测试。
准备工作
python3.6及以上
pytest
案例
有一个函数check_data_accuracy(df),用于检查DataFrame中无限接近于的0的数值,并将其置为0。
将数值介于-1.0e-38和1.0e-38之间的数置为0。
单元测试
-
项目结构
src/check_util.py 检查函数
test/test_check_util.py 测试脚本
image.png
-
首先在项目中建立test目录,并创建测试脚本,命名方式'test_xxx.py',一般而言,xxx为要测试的模块的名字。
image.png
-
编写测试用例
src/check_util.py
# -*- coding: UTF-8 -*-
"""
各种检查工具函数
version: 2020-06-29
"""
import pandas as pd
from pandas.api.types import is_numeric_dtype
def check_data_accuracy(df):
"""
用于检查df中的浮点数类型是否超过的redshfit的double范围。若超过置为np.nan,否则会引起copy失败。
"""
for column in df.columns:
if is_numeric_dtype(df[column]):
s = pd.Series(df[column])
s[(s > -1.0e-38) & (s < 1.0e-38)] = 0
df[column] = s
return df
test/test_check_util.py
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
import pandas as pd
from src.check_util import check_data_accuracy
"""
check_util.check_data_accuracy 测试
"""
def test_check_data_accuracy_small_float():
"""
测试 1.12e-323 是否变为0
:return:
"""
mock_data = {
'a': [1, 2, 3],
'b': [1.12e-323, 1.1245, 789]
}
mock_df = pd.DataFrame(mock_data)
res_df = check_data_accuracy(mock_df)
assert res_df['b'][0] == 0
def test_check_data_accuracy_negative():
"""
测试 -1.12e-323 是否变为0
:return:
"""
mock_data = {
'a': [1, 2, 3],
'b': [-1.12e-323, 1.1245, 789]
}
mock_df = pd.DataFrame(mock_data)
res_df = check_data_accuracy(mock_df)
assert res_df['b'][0] == 0
def test_check_data_accuracy_positive():
"""
测试 e38的正数是否正常
:return:
"""
mock_data = {
'a': [1, 2, 3],
'b': [1.12e+38, 1.1245, 789]
}
mock_df = pd.DataFrame(mock_data)
res_df = check_data_accuracy(mock_df)
assert res_df['b'][0] == 1.12e+38
- 执行单元测试脚本
一版而言,有两种方式运行单元测试脚本。
- 一种是直接执行pytest命令。
- 另一种是"pytest xxx.py",xxx是测试脚本的名字。
-
查看测试结果
image.png
绿点表示成功,红点表示失败。
网友评论