如何使用 pytest 测试 Turtle 库函数?

问题描述 投票:0回答:1

长话短说:我是一名中学计算机科学老师,最近完全丢失了我用来教授 Python 语法的程序。我正在尝试使用 pytest 自己重建它。我的背景不是Python,而是Java、JavaScript和C#,但我工作的地区坚持使用Python。所以我在教我的学生的同时也在自学语法。 (这对我有代码基础很有帮助,这样我就可以比他们学得更快!)

我正在尝试找出如何测试我的学生是否正确完成了 Turtle 代码。

因此,如果我要求学生用 Turtle 画一条虚线,而他们却画一条实线,我该如何测试呢?从逻辑上讲,应该可以有 pytest 检查代码而不是输出,对吧?

代码应该是(是的,这是在循环中使用它的先驱):

def dotted_line():
  t.pendown()
  t.forward(5)
  t.penup()
  t.forward(5)
  t.pendown()
  t.forward(5)

必须有一种方法来测试这一点,对吗?或者我可以将代码转换为测试中的输出吗?

python pytest python-turtle
1个回答
0
投票

这是一个好问题。海龟的问题在于输出是图形窗口而不是文本或您通常测试的对象。有许多(无限)方法可以编写在屏幕上生成图像的代码,因此任何模拟海龟对象并确保使用特定值调用某些方法的测试用例都是行不通的。

考虑到这一背景,我将编写一个测试套件来运行学生的海龟代码并捕获图像文件中的输出。从这里开始,就需要使用 Pillow 的 ImageChops 这样的库来设置视觉差异,这可以帮助确保轻微的变化不会出现问题。您可以这样说:如果学生的图像与预期结果相差 100 像素以内,则通过,否则失败 - 甚至根据准确性进行部分评分。

这种方法的缺点是,使用代码来生成文件有点棘手:学生可能必须获得图像生成代码作为工具。此外,如果学生的输出基本上是完美的,但移动了几个像素,使得虚线相对于参考图像偏离中心,则会产生失败。为学生提供工具,以便他们可以运行自己的代码并进行调整,这是避免意外和不公平索赔的好方法。

另一个很酷的方面是,许多图像比较库将差异显示为图像,因此学生可以准确地看到他们失败的原因,而不是模糊的“图像与预期不匹配”报告。

© www.soinside.com 2019 - 2024. All rights reserved.