在 Jupyter notebooks 中进行单元测试
Python中文社区
共 8703字,需浏览 18分钟
· 2021-03-27
import datetime
import dateutil
def make_url(date):
"""Return the url for our API call based on date."""
if isinstance(date, str):
date = dateutil.parser.parse(date).date()
elif not isinstance(date, datetime.date):
raise ValueError("must be a date")
if date >= datetime.date(2020, 1, 1):
return f"https://api.example.com/v2/{date.year}/{date.month}/{date.day}"
else:
return f"https://api.example.com/v1/{date:%Y-%m-%d}"
unittest.main
方法,可能是__main__
防护中的默认方法。我们基本上可以在Jupyter notebook中执行相同的操作。我们可以创建一个unitest.TestCase
类,执行所需的测试,然后仅在任何单元格中执行单元测试。您只需要保存unittest.main
方法的输出并检查是否有错误。import unittest
class TestUrl(unittest.TestCase):
def test_make_url_v2(self):
date = datetime.date(2020, 1, 1)
self.assertEqual(make_url(date), "https://api.example.com/v2/2020/1/1")
def test_make_url_v1(self):
date = datetime.date(2019, 12, 31)
self.assertEqual(make_url(date), "https://api.example.com/v1/2019-12-31")
res = unittest.main(argv=[''], verbosity=3, exit=False)
# if we want our notebook to stop processing due to failures, we need a cell itself to fail
assert len(res.result.failures) == 0
test_make_url_v1 (__main__.TestUrl) ... ok
test_make_url_v2 (__main__.TestUrl) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK
if __name__ == __main__:
doctest.testmod()
make_url
方法。def make_url(date):
"""Return the url for our API call based on date.
>>> make_url("1/1/2020")
'https://api.example.com/v2/2020/1/1'
>>> make_url("1-1-x1")
Traceback (most recent call last):
...
dateutil.parser._parser.ParserError: Unknown string format: 1-1-x1
>>> make_url("1/1/20001")
Traceback (most recent call last):
...
dateutil.parser._parser.ParserError: year 20001 is out of range: 1/1/20001
>>> make_url(datetime.date(2020,1,1))
'https://api.example.com/v2/2020/1/1'
>>> make_url(datetime.date(2019,12,31))
'https://api.example.com/v1/2019-12-31'
"""
if isinstance(date, str):
date = dateutil.parser.parse(date).date()
elif not isinstance(date, datetime.date):
raise ValueError("must be a date")
if date >= datetime.date(2020, 1, 1):
return f"https://api.example.com/v2/{date.year}/{date.month}/{date.day}"
else:
return f"https://api.example.com/v1/{date:%Y-%m-%d}"
import doctest
doctest.testmod()
TestResults(failed=0, attempted=5)
pip install testbook
%pip install testbook
import datetime
import testbook
@testbook.testbook('./jupyter_unit_tests.ipynb', execute=True)
def test_make_url(tb):
func = tb.ref("make_url")
date = datetime.date(2020, 1, 2)
assert make_url(date) == "https://api.example.com/v2/2020/1/1"
pytest jupyter_unit_tests.py
datetime.date
传递给make_url
方法,而是传递一个字符串(2020-01-02),然后将其解析为一个日期。您如何将日期从单元测试传递到notebook代码中?您有以下几种选择。首先,您可以在notebook中创建一个日期对象,仅用于测试目的,然后在单元测试中引用它。testdate1 = datetime.date(2020,1,1) # for unit test
jupyter_unit_tests.py
上,然后使用您喜欢的单元测试框架来运行它。import datetime
import testbook
@testbook.testbook('./jupyter_unit_tests.ipynb', execute=True)
def test_make_url(tb):
f = tb.ref("make_url")
d = "2020-01-02"
assert f(d) == "https://api.example.com/v2/2020/1/2"
# note that this is actually converted to a string
d = datetime.date(2020, 1, 2)
assert f(d) == "https://api.example.com/v2/2020/1/2"
# this one will be testing the date functionality
d2 = tb.ref("testdate1")
assert f(d2) == "https://api.example.com/v2/2020/1/1"
# this one will inject similar code as above, then use it
tb.inject("d3 = datetime.date(2020, 2, 3)")
d3 = tb.ref("d3")
assert f(d3) == "https://api.example.com/v2/2020/2/3"
更多阅读
特别推荐
点击下方阅读原文加入社区会员
评论
老爸嘲讽我了,写破代码一年就挣十几万,他在工地带50个工人,一个月光人头费就3万,让我滚回去跟他干!
点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接,进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群来自:网络,侵删有个网友的父亲是做工程的,天天就嘲笑他,说他天天写着破代码有啥用,一年就拿个十多万的死工资,然后告诉他自己在工地里面带了50个工人,一个月能抽三万
程序源代码
0
把 Jupyter Notebook 变成网页
我的写作基础设施:1、Typora2、Cloudflare R23、Picgo4、Obsidian5、GitHub6、mdnice本合集会一一介绍上述工具的安装、配置、使用等等还会介绍:服务器配置GitHub Pages、Cloudflare Pages、Vercel 的使用用 Jekyll、Boo
机器学习算法与Python实战
0
面试官:在原生input上面使用v-model和组件上面使用有什么区别?
前言面试官:vue3的v-model都用过吧,来讲讲。粉丝:v-model其实就是一个语法糖,在编译时v-model会被编译成:modelValue属性和@update:modelValue事件。一般在子组件中定义一个名为modelValue的props来接收父组件v-model传递的值,然后当子组
高级前端进阶
0
分享几个前端中好玩且有用的开源工具,总有一个适合你!
点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群正所谓差生文具多,作为前端的我们,拥有几个合适的工具和网站可以很有效的提高我们的工具效率,还会有一些很有趣的网站可以在我们敲 bug 累了的时候供我们娱乐,接下来我就和大嘎分析一下我在用的一些工具和网站。聚合API该网站提供了大量的
前端Q
0
图解 transformer 中的自注意力机制
↓推荐关注↓本文将将介绍注意力的概念从何而来,它是如何工作的以及它的简单的实现。注意力机制在整个注意力过程中,模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。假设有一个数据库,里面有所有一些作家和他们的书籍信息。现在我想读一些Rabindra
Python学习与数据挖掘
0
AI智能视觉检测技术在工业级测量领域的创新应用--AMB Tube-Q导管数字化测量系统
技术背景在深度学习算法出来之前,对于视觉算法来说,大致可以分为以下5个步骤:特征感知,图像预处理,特征提取,特征筛选,推理预测与识别。早期的机器学习中,占优势的统计机器学习群体中,对特征是不大关心的。深度学习是机器学习技术的一个方面,由人工神经网络提供支持。深度学习技术的工作原理是教机器通过实例学习
机器视觉
0
下沉市场对黄金的偏爱,停滞在金价飙升之前
狂买还是狂卖?冲击万店,汉堡界能跑出下一个蜜雪冰城吗?最近一段时间金价的暴涨,已从部分人的惊喜变成大众的惊吓。大众的讨论从升值贬值、这个时间段入手是否合适,开始变成“上次金价暴涨世界发生了什么?”的担忧。金价狂涨在互联网中已经演变为大众话题,无论准不准备囤黄金,手头有没有黄金,都或多或少关注着金价的
亿欧网
0
C#中using的使用的几种场景
using在C#中随处可见,比如引入命名空间,这是也是每个C#的cs页面必须存在的,除了引入命名空间还有几种用法,下面将介绍这几种的使用。1、用于引入命名空间 这是最常见最基本的用法, 这样可以在程序中直
dotNET全栈开发
10