繁体   English   中英

如何测试是否在Python中导入了模块以进行游戏的测试驱动开发?

[英]How do I test whether a module is imported in Python for Test-Driven Development of a game?

我即将使用python和libtcod roguelike游戏库制作游戏。

更重要的是,我正在使用PyMock,因为我才刚刚开始学习测试驱动开发,并且决心不作弊。 我真的很想养成正确执行操作的习惯,根据TDD的说法,在编写第一行代码之前,我需要一个失败的单元测试。

我认为我的“生产”代码的第一个测试应该是导入了它的依赖项libcotdpy。

我的测试文件:

#!/usr/bin/python
import pymock   # for mocking and unit testing
import game     # my (empty) production code file, game.py

class InitializeTest(pymock.PyMockTestCase):
    def test_libtcod_is_imported(self):
        # How do I test that my production file imports the libtcodpy module?

if __name__=="__main__":
    import unittest
    unittest.main()

请:

1)(python人)如何测试模块是否已加载?

2)(TDD人员)我是否应该对此基本功能进行单元测试? 如果没有,我应该测试的第一件事是什么?

1) 'your_module' in sys.modules 但是,实际上不要使用它:

2)我应该你的图书馆应该怎么办? 是否“依赖libcotdpy”? 我觉得不是。

您刚刚做出了非测试驱动的设计选择!

编写一个测试,演示您如何使用该库。 不要考虑您将如何实现它。 例如:

player = my_lib.PlayerCharacter()
assert player.position == (0, 0)  # or whatever assert syntax `pymock` uses
press_key('k')
assert player.position == (0, 1)

或类似的东西。 (我不知道您想让您的库做什么,或者libtcod提供了多少。)

我通常对TDD(和BDD)的看法是在两个发展水平上:接受测试水平和单元测试水平。

我要做的第一件事就是写故事(接受标准)。 您的应用程序的核心功能是什么? 定义一个端到端方案,该方案显式显示一个功能,并与此相关。 那是你的第一个故事。 使用验收测试(或集成测试)框架为此编写测试。 不幸的是,我不了解Python工具,但是在Java中,我会使用JBehaveFITnesse 这将是一个非常高级的东西,与代码相去甚远,将您的应用程序视为“黑匣子”。 类似于“当我的输入参数为xxx时,我运行我的应用程序,预期的输出为yyyy”。

运行此测试,它将失败,因为基础应用程序不存在。 创建最少的类使其变红(并且不再抛出异常)。 那就是您需要启动TDD的第二阶段:unit-TDD的时候。 从顶层到细节,这基本上是一个“递减分析”,此阶段将包含许多红绿重构循环,从而在游戏中带来许多不同的单元。

有时,请重新运行原始的验收测试,或者如果您不断增长的体系结构和分析迫使您对规格进行更改(从理论上讲,该阶段不应该在此阶段进行,但实际上经常需要进行更改),则可以对其进行完善。 。 当您的验收测试完全变成绿色时,您就完成了这个故事,然后冲洗并重复。

所有这些使我明白:纯TDD(我的意思是单位TDD)不切实际。 我的意思是说我真的很喜欢TDD,但是从长远来看,认真地遵循TDD将会比麻烦的多得多。 有时,您会采用一种方法来查看该方法是否适合您项目的其余部分,而无需先为其编写测试,并可能使用TDD对其进行重写。 但是只要您有接受测试覆盖所有批次的产品,就可以了

即使有方法可以测试,我还是建议不要这样做。

从客户端角度(从内到外)测试,SUT(游戏)提供什么行为。 您的测试(或您的用户)不需要知道(/关心)您是否使用库公开了此行为。 只要行为没有中断,您的测试就应该通过。

就像另一个答案说的那样,也许您不需要依赖关系-可能有一个更简单的解决方案(例如,哈希表可以在您本能地跳到关系数据库的地方做)。 听测试...让测试拉入行为。

这也使您将来可以自由更改依赖关系,而不必进行大量测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM