Mit Jupyter, PyHamcrest und einem kleinen Testcode, der sie miteinander verbindet, können Sie jeden Python-Inhalt unterrichten, der für Unit-Tests geeignet ist. In der Spalte „Python-Video-Tutorial“ erhalten Sie eine detaillierte Einführung. ~
Wenn wir diese erstaunlichen Tools nur in Python integrieren könnten, sollten wir es besser machen können. Ja, mit Jupyter Notebook, PyHamcrest und einem kleinen Klebeband-ähnlichen Klebecode können wir ein Tutorial erstellen, das Anweisungen, Arbeitscode und Code enthält, der korrigiert werden muss. Zuerst benötigen Sie etwas „Klebeband“. Normalerweise verwenden Sie für Ihre Tests einen raffinierten Befehlszeilentester wie Pytest oder Virtue. Oft wird es nicht einmal direkt ausgeführt. Zum Ausführen verwenden Sie ein Tool wie tox oder nox. Bei Jupyter müssen Sie jedoch einen kleinen Klebercode schreiben, mit dem Sie den Test direkt ausführen können.
Glücklicherweise ist dieser Code kurz und einfach:
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) ---------------------------------------------------------------------- Traceback (most recent call last): File "<ipython-input-7-5ebe25bc00f3>", line 6, in test_equality self.assertEqual(1+1, expected_value) AssertionError: 2 != 3 ---------------------------------------------------------------------- Ran 1 test in 0.002s FAILED (failures=1)复制代码
return
ändern. In diesem Fall ist die Lösung einfach: @run_test class TestNumbers(unittest.TestCase): def test_equality(self): expected_value = 2 # 修复后的代码行 self.assertEqual(1+1, expected_value)复制代码
test_equality (__main__.TestNumbers) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.002s OK复制代码
unittest
-Bibliothek als unzureichend erweisen. In pytest
wird dieses Problem gelöst, indem der Bytecode in assert
umgeschrieben wird, um magische Eigenschaften und verschiedene Heuristiken zu haben. Dies ist jedoch im Jupyter-Notebook nicht einfach zu erreichen. Es ist Zeit, eine gute Assertionsbibliothek auszugraben: PyHamcrest. from hamcrest import * @run_test class TestList(unittest.TestCase): def test_equality(self): things = [1, 5, # 只改这一行 3] assert_that(things, has_items(1, 2, 3))复制代码
test_equality (__main__.TestList) ... FAIL ====================================================================== FAIL: test_equality (__main__.TestList) ---------------------------------------------------------------------- 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.004s FAILED (failures=1)复制代码
[1, 5, 3]
enthält kein 2
und sieht hässlich aus: @run_test class TestList(unittest.TestCase): def test_equality(self): things = [1, 2, # 改完的行 3] assert_that(things, has_items(1, 2, 3))复制代码
test_equality (__main__.TestList) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.001s OK复制代码
return
来修复测试。
在这种情况下,修复很容易:
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")))复制代码
test_complete_strip (__main__.TestList) ... ok test_end_strip (__main__.TestList) ... FAIL test_start_strip (__main__.TestList) ... FAIL ====================================================================== FAIL: test_end_strip (__main__.TestList) ---------------------------------------------------------------------- Traceback (most recent call last): File "<ipython-input-16-3db7465bd5bf>", 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 ending with 'world' was ' hello world ' ====================================================================== FAIL: test_start_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 ' ---------------------------------------------------------------------- Ran 3 tests in 0.006s FAILED (failures=2)复制代码
然而,很快,unittest
库的原生断言将被证明是不够的。在 pytest
中,通过重写 assert
中的字节码来解决这个问题,使其具有神奇的属性和各种启发式方法。但这在 Jupyter notebook 中就不容易实现了。是时候挖出一个好的断言库了:PyHamcrest。
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.strip() # 改完的行 assert_that(result, all_of(starts_with("hello"), ends_with("world "))) def test_end_strip(self): result = source_string.strip() # 改完的行 assert_that(result, all_of(starts_with(" hello"), ends_with("world")))复制代码
test_complete_strip (__main__.TestList) ... ok test_end_strip (__main__.TestList) ... FAIL test_start_strip (__main__.TestList) ... FAIL ====================================================================== FAIL: test_end_strip (__main__.TestList) ---------------------------------------------------------------------- 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) ---------------------------------------------------------------------- Traceback (most recent call last): File "<ipython-input-17-6f9cfa1a997f>", 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 ending with 'world ' was 'hello world' ---------------------------------------------------------------------- Ran 3 tests in 0.007s FAILED (failures=2)复制代码
PyHamcrest 不仅擅长灵活的断言,它还擅长清晰的错误信息。正因为如此,问题就显而易见了。[1, 5, 3]
不包含 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")))复制代码
test_complete_strip (__main__.TestList) ... ok test_end_strip (__main__.TestList) ... ok test_start_strip (__main__.TestList) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.005s OK复制代码
使用 Jupyter、PyHamcrest 和一点测试的粘合代码,你可以教授任何适用于单元测试的 Python 主题。
例如,下面可以帮助展示 Python 从字符串中去掉空白的不同方法之间的差异。
rrreeerrreee理想情况下,学生们会意识到 .lstrip()
和 .rstrip()
这两个方法可以满足他们的需要。但如果他们不这样做,而是试图到处使用 .strip()
Das Folgende zeigt beispielsweise die Unterschiede zwischen den verschiedenen Methoden von Python zum Entfernen von Leerzeichen aus Zeichenfolgen.
Im Idealfall werden die Schüler erkennen, dass .lstrip()
und .rstrip()
ihren Bedürfnissen entsprechen. Aber wenn sie das nicht tun und stattdessen versuchen, .strip()
überall zu verwenden:
, erhalten sie eine andere Fehlermeldung, die anzeigt, dass zu viel Leerraum entfernt wurde:
rrreeerrreeein einem In realistischere Tutorials, es wird mehr Beispiele und mehr Erklärungen geben. Diese Technik der Verwendung von Jupyter Notebook kann für einige Beispiele verwendet werden, und einige Beispiele müssen korrigiert werden. Sie kann für den Echtzeitunterricht, für Videounterricht und sogar für andere verstreute Zwecke verwendet werden, sodass Schüler ein Tutorial absolvieren können selbst.
Teilen Sie jetzt Ihr Wissen!🎜🎜Weitere verwandte kostenlose Lernempfehlungen: Python-Video-Tutorial
Das obige ist der detaillierte Inhalt vonLernen Sie Python mit Jupyter Notebook. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!