当前位置:首页 > 科技  > 软件

数据工程中的单元测试完全指南

来源: 责编: 时间:2023-09-20 21:51:38 402观看
导读在数据工程领域中,经常被忽视的一项实践是单元测试。许多人可能认为单元测试仅仅是一种软件开发方法论,但事实远非如此。随着我们努力构建稳健、无错误的数据流水线和SQL数据模型,单元测试在数据工程中的价值变得越来越

在数据工程领域中,经常被忽视的一项实践是单元测试。许多人可能认为单元测试仅仅是一种软件开发方法论,但事实远非如此。随着我们努力构建稳健、无错误的数据流水线和SQL数据模型,单元测试在数据工程中的价值变得越来越清晰。awe28资讯网——每日最新资讯28at.com

本文带你深入探索如何将这些成熟的软件工程实践应用到数据工程中。awe28资讯网——每日最新资讯28at.com

1 单元测试的重要性

在数据工程的背景下,采用单元测试可以确保您的数据和业务逻辑的准确性,进而产出高质量的数据,获得您的数据分析师、科学家和决策者对数据的信任。awe28资讯网——每日最新资讯28at.com

2 单元测试数据流水线

数据流水线通常涉及复杂的数据抽取、转换和加载(ETL)操作序列,出错的可能性很大。为了对这些操作进行单元测试,我们将流水线拆分为单个组件,并对每个组件进行独立验证。awe28资讯网——每日最新资讯28at.com

以一个简单的流水线为例,该流水线从CSV文件中提取数据,通过清除空值来转换数据,然后将其加载到数据库中。以下是使用pandas的基于Python的示例:awe28资讯网——每日最新资讯28at.com

import pandas as pdfrom sqlalchemy import create_engine# 加载CSV文件的函数def load_data(file_name):    data = pd.read_csv(file_name)    return data# 清理数据的函数def clean_data(data):    data = data.dropna()    return data# 将数据保存到SQL数据库的函数def save_data(data, db_string, table_name):    engine = create_engine(db_string)    data.to_sql(table_name, engine, if_exists='replace')# 运行数据流水线data = load_data('data.csv')data = clean_data(data)save_data(data, 'sqlite:///database.db', 'my_table')

为了对这个流水线进行单元测试,我们使用像pytest这样的库为每个函数编写单独的测试。awe28资讯网——每日最新资讯28at.com

在这个示例中,有三个主要的函数:load_data、clean_data和save_data。我们会为每个函数编写测试。对于load_data和save_data,需要设置一个临时的CSV文件和SQLite数据库,可以使用pytest库的fixture功能来实现。awe28资讯网——每日最新资讯28at.com

import osimport pandas as pdimport pytestfrom sqlalchemy import create_engine, inspect# 使用pytest fixture来设置临时的CSV文件和SQLite数据库@pytest.fixturedef csv_file(tmp_path):    data = pd.DataFrame({        'name': ['John', 'Jane', 'Doe'],        'age': [34, None, 56]  # Jane的年龄缺失    })    file_path = tmp_path / "data.csv"    data.to_csv(file_path, index=False)    return file_path@pytest.fixturedef sqlite_db(tmp_path):    file_path = tmp_path / "database.db"    return 'sqlite:///' + str(file_path)def test_load_data(csv_file):    data = load_data(csv_file)        assert 'name' in data.columns    assert 'age' in data.columns    assert len(data) == 3def test_clean_data(csv_file):    data = load_data(csv_file)    data = clean_data(data)        assert data['age'].isna().sum() == 0    assert len(data) == 2  # Jane的记录应该被删除def test_save_data(csv_file, sqlite_db):    data = load_data(csv_file)    data = clean_data(data)    save_data(data, sqlite_db, 'my_table')        # 检查数据是否保存正确    engine = create_engine(sqlite_db)    inspector = inspect(engine)    tables = inspector.get_table_names()        assert 'my_table' in tables        loaded_data = pd.read_sql('my_table', engine)    assert len(loaded_data) == 2  # 只应该存在John和Doe的记录

这里是另一个例子:假设您有一个从CSV文件中加载数据并将其中的“日期”列从字符串转换为日期时间的流水线:awe28资讯网——每日最新资讯28at.com

def convert_date(data, date_column):    data[date_column] = pd.to_datetime(data[date_column])    return data

为上述函数编写的单元测试将传入具有已知日期字符串格式的DataFrame。然后,它将验证函数是否正确将日期转换为日期时间对象,并且它是否适当处理无效格式。awe28资讯网——每日最新资讯28at.com

我们为上述场景编写一个单元测试。该测试首先使用有效日期检查函数,断言输出DataFrame中的“date”列确实是datetime类型,并且值与预期相符。然后,它检查在给出无效日期时,函数是否正确引发了ValueError。awe28资讯网——每日最新资讯28at.com

import pandas as pdimport pytestdef test_convert_date():    # 使用有效日期进行测试    test_data = pd.DataFrame({        'date': ['2021-01-01', '2021-01-02']    })        converted_data = convert_date(test_data.copy(), 'date')        assert pd.api.types.is_datetime64_any_dtype(converted_data['date'])    assert converted_data.loc[0, 'date'] == pd.Timestamp('2021-01-01')    assert converted_data.loc[1, 'date'] == pd.Timestamp('2021-01-02')    # 使用无效日期进行测试    test_data = pd.DataFrame({        'date': ['2021-13-01']  # 这个日期是无效的,因为没有第13个月    })        with pytest.raises(ValueError):        convert_date(test_data, 'date')

以下是最后一个例子:假设您有一个加载数据并进行聚合的流水线,计算每个地区的总销售额:awe28资讯网——每日最新资讯28at.com

def aggregate_sales(data):    aggregated = data.groupby('region').sales.sum().reset_index()    return aggregated

为该函数编写的单元测试将向其传递具有各个地区销售数据的DataFrame。测试将验证函数是否正确计算每个地区的总销售额。awe28资讯网——每日最新资讯28at.com

我们为该函数编写一个单元测试。在这个测试中,我们首先向aggregate_sales函数传递一个具有已知销售数据的DataFrame,并检查它是否正确聚合了销售额。然后,向其传递一个没有销售数据的DataFrame,并检查它是否正确将这些销售额聚合为0。这样可以确保函数正确处理典型情况和边缘情况。awe28资讯网——每日最新资讯28at.com

以下是使用pytest库为aggregate_sales函数编写单元测试的示例:awe28资讯网——每日最新资讯28at.com

import pandas as pdimport pytestdef test_aggregate_sales():    # 各个地区的销售数据    test_data = pd.DataFrame({        'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West'],        'sales': [100, 200, 300, 400, 500, 600, 700, 800]    })        aggregated = aggregate_sales(test_data)        assert aggregated.loc[aggregated['region'] == 'North', 'sales'].values[0] == 300    assert aggregated.loc[aggregated['region'] == 'South', 'sales'].values[0] == 700    assert aggregated.loc[aggregated['region'] == 'East', 'sales'].values[0] == 1100    assert aggregated.loc[aggregated['region'] == 'West', 'sales'].values[0] == 1500    # 没有销售数据的测试    test_data = pd.DataFrame({        'region': ['North', 'South', 'East', 'West'],        'sales': [0, 0, 0, 0]    })        aggregated = aggregate_sales(test_data)        assert aggregated.loc[aggregated['region'] == 'North', 'sales'].values[0] == 0    assert aggregated.loc[aggregated['region'] == 'South', 'sales'].values[0] == 0    assert aggregated.loc[aggregated['region'] == 'East', 'sales'].values[0] == 0    assert aggregated.loc[aggregated['region'] == 'West', 'sales'].values[0] == 0

本文转载自微信公众号「Java学研大本营」,可以通过以下二维码关注。转载本文请联系公众号。awe28资讯网——每日最新资讯28at.com

awe28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10690-0.html数据工程中的单元测试完全指南

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ZGC关键技术分析

下一篇: 团队协作开发中,五个强大的VS Code插件

标签:
  • 热门焦点
  • 俄罗斯:将审查iPhone等外国公司设备 保数据安全

    iPhone和特斯拉都属于在各自领域领头羊的品牌,推出的产品也也都是数一数二的,但对于一些国家而言,它们的产品可靠性和安全性还是在限制范围内。近日,俄罗斯联邦通信、信息技术
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会隆重举行

    9月18日,2021中国国际消费电子博览会与青岛国际软件融合创新博览会新闻发布会在青岛国际新闻中心隆重举行。发布会上青岛市政府领导联袂出席,对本次双展会情
Top