用 Jupyter Notebook 教 Python

有了 Jupyter、PyHamcrest,用一点测试的代码把它们连在一起,你就可以教任何适用于单元测试的 Python 内容。

有了 Jupyter、PyHamcrest,用一点测试的代码把它们连在一起,你就可以教任何适用于单元测试的 Python 内容。

用 Jupyter Notebook 教 Python

关于 Ruby 社区的一些事情一直让我印象深刻,其中两个例子是对测试的承诺和对易于上手的强调。这两方面最好的例子是 Ruby Koans,在这里你可以通过修复测试来学习 Ruby。

要是我们能把这些神奇的工具也用于 Python,我们应该可以做得更好。是的,使用 Jupyter NotebookPyHamcrest,再加上一点类似于胶带的粘合代码,我们可以做出一个包括教学、可工作的代码和需要修复的代码的教程。

首先,需要一些“胶布”。通常,你会使用一些漂亮的命令行测试器来做测试,比如 pytestvirtue。通常,你甚至不会直接运行它。你使用像 toxnox 这样的工具来运行它。然而,对于 Jupyter 来说,你需要写一小段粘合代码,可以直接在其中运行测试。

幸运的是,这个代码又短又简单:

“`
import unittest

def run_test(klass):
suite = unittest.TestLoader().loadTestsFromTestCase(klass)
unittest.TextTestRunner(verbosity=2).run(suite)
return klass

“`

现在,装备已经就绪,可以进行第一次练习了。

在教学中,从一个简单的练习开始,建立信心总是一个好主意。

那么,让我们来修复一个非常简单的测试:

“`
@run_test
class TestNumbers(unittest.TestCase):

def test_equality(self):
    expected_value = 3 # 只改这一行
    self.assertEqual(1+1, expected_value)

“`

“`
test_equality (main.TestNumbers) … FAIL

======================================================================
FAIL: test_equality (__main__.TestNumbers)
-
Ran 1 test in 0.002s

FAILED (failures=1)

“`

“只改这一行” 对学生来说是一个有用的标记。它准确地表明了需要修改的内容。否则,学生可以通过将第一行改为 return 来修复测试。

在这种情况下,修复很容易:

“`
@run_test
class TestNumbers(unittest.TestCase):

def test_equality(self):
    expected_value = 2 # 修复后的代码行
    self.assertEqual(1+1, expected_value)

“`

“`
test_equality (main.TestNumbers) … ok

-
Traceback (most recent call last):
  File "<ipython-input-11-96c91225ee7d>", line 8, in test_equality
    assert_that(things, has_items(1, 2, 3))
AssertionError:
Expected: (a sequence containing <1> and a sequence containing <2> and a sequence containing <3>)
     but: a sequence containing <2> was <[1, 5, 3]>


-
Ran 1 test in 0.001s

OK

“`

使用 Jupyter、PyHamcrest 和一点测试的粘合代码,你可以教授任何适用于单元测试的 Python 主题。

例如,下面可以帮助展示 Python 从字符串中去掉空白的不同方法之间的差异。

“`
source_string = ” hello world “

@run_test
class TestList(unittest.TestCase):

# 这是个赠品:它可以工作!
def test_complete_strip(self):
    result = source_string.strip()
    assert_that(result,
               all_of(starts_with("hello"), ends_with("world")))

def test_start_strip(self):
    result = source_string # 只改这一行
    assert_that(result,
               all_of(starts_with("hello"), ends_with("world  ")))

def test_end_strip(self):
    result = source_string # 只改这一行
    assert_that(result,
               all_of(starts_with("  hello"), ends_with("world")))

“`

“`
testcompletestrip (main.TestList) … ok
testendstrip (main.TestList) … FAIL
teststartstrip (main.TestList) … FAIL

======================================================================
FAIL: test_end_strip (__main__.TestList)
-
Traceback (most recent call last):
  File "<ipython-input-16-3db7465bd5bf>", line 14, in test_start_strip
    assert_that(result,
AssertionError:
Expected: (a string starting with 'hello' and a string ending with 'world  ')
     but: a string starting with 'hello' was '  hello world  '


-
Traceback (most recent call last):
  File "<ipython-input-17-6f9cfa1a997f>", line 19, in test_end_strip
    assert_that(result,
AssertionError:
Expected: (a string starting with '  hello' and a string ending with 'world')
     but: a string starting with '  hello' was 'hello world'


======================================================================
FAIL: test_start_strip (__main__.TestList)
-
Ran 3 tests in 0.007s

FAILED (failures=2)

“`

他们会得到一个不同的错误信息,显示去除了过多的空白:

“`
source_string = ” hello world “

@run_test
class TestList(unittest.TestCase):

# 这是个赠品:它可以工作!
def test_complete_strip(self):
    result = source_string.strip()
    assert_that(result,
               all_of(starts_with("hello"), ends_with("world")))

def test_start_strip(self):
    result = source_string.lstrip() # Fixed this line
    assert_that(result,
               all_of(starts_with("hello"), ends_with("world  ")))

def test_end_strip(self):
    result = source_string.rstrip() # Fixed this line
    assert_that(result,
               all_of(starts_with("  hello"), ends_with("world")))

“`

“`
testcompletestrip (main.TestList) … ok
testendstrip (main.TestList) … ok
teststartstrip (main.TestList) … ok

via: https://opensource.com/article/20/9/teach-python-jupyter

作者:Moshe Zadka 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

主题测试文章,只做测试使用。发布者:eason,转转请注明出处:https://aicodev.cn/2020/09/24/%e7%94%a8-jupyter-notebook-%e6%95%99-python/

Like (0)
eason的头像eason
Previous 2020年9月23日
Next 2020年9月24日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信