大多数在 edx-platform 中添加了功能的开发者都熟悉 模块存储测试用例. 如果您的测试练习与课件内容相关的任何内容(即使它只是创建一个空课程),从此类继承将确保在各个测试之间正确清理数据。 这是非常有价值的,但在许多情况下也可能是浪费的。 在上周的黑客马拉松中,我创建了 更快的选择 被称为 共享模块存储测试用例.
不比 模块存储测试用例, 共享模块存储测试用例 只做 模块存储 在清理 撕裂类() 等级。 它适用于可以预先初始化一个或一小部分课程,然后在许多测试中以只读方式共享的情况。 这种使用模式在 LMS 测试中很常见,通常只是在他们的测试中一遍又一遍地重新创建相同的课程。 设置() 方法。
性能影响
为了了解它可能产生的效果,我切换了一些测试模块作为我的黑客马拉松工作的一部分。 这些只是粗略的数字,因为它们基于相对少量的 Jenkins 测试运行。 话虽如此,结果是有希望的:
| 文件 | # 测试 | 申请早于 | 后 | Delta |
| lms/djangoapps/ccx/tests/test_ccx_modulestore.py | 5 | 38s | 4s | -89% |
| lms/djangoapps/discussion_api/tests/test_api.py | 409 | 2m 45s | 51s | -69% |
| lms/djangoapps/teams/tests/test_views.py | 152 | 1m 17s | 33s | -57% |
那么如何转换自己的测试呢?
使开关
大多数继承自的类 模块存储测试用例 开始这样的事情:

如果你正在修改 自学课程 在您的个人测试功能中,那么这是完美的,您应该继续使用 模块存储测试用例. 但是,如果您只是设置一次课程并在测试中将其视为只读,您现在可以这样做:

重要的是 Django ORM 操作保留在 设置(). 您在其中创建的任何模型 设置类() 必须在您的手动删除 撕裂类() 方法 - 共享模块存储测试用例 不会正确清理它们。 即使您很小心,您仍然可能以不可预知的方式破坏系统中的其他测试,因为它们对序列以及在设置数据时将创建什么 ID 做出了错误的假设。 调试起来可能非常乏味。
当我们升级到 Django 1.8 时,您将能够使用 设置测试数据() 使用自动清理安全地对 Django 模型进行类级初始化。 请等待升级并将模型操作放入 设置() 现在,即使它有点慢。
我应该转换哪些测试?
寻找测试优化目标最容易的地方是 Jenkins 测试构建报告. 单击“持续时间”以按该列排序。

我们主要希望针对昂贵的测试,这些测试要么创建复杂的课程数据(例如 CCX),要么具有简单的课程数据但有很多很多的测试(例如讨论)。 即使是最简单的课程也需要大约 250-300 毫秒左右的时间,这在使用诸如 DDT 这有效地增加了一个类中的测试数量。
整体外卖
数据库访问是运行测试的昂贵部分,并且 模块存储 就是一个典型的例子。 我希望 共享模块存储测试用例 可以成为减少测试执行时间的有用工具。 但除此之外,我希望了解它的工作原理将使我们能够设计出更快的测试套件。
Dave Ormsbee 是 edX 的高级架构师。 这篇文章最初发表在他的博客上, 沼泽城堡.
![]()