编写更快的 ModuleStore 测试

24 年 2015 月 XNUMX 日 | 作者:

大多数在 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%

 

那么如何转换自己的测试呢?

使开关

大多数继承自的类 模块存储测试用例 开始这样的事情:

带有语法高亮的 Python 代码。 要查看源代码,请阅读 http://swampcastle.org/2015/07/28/writing-faster-modulestore-tests.html 上的原始博客文章

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

带有语法高亮的 Python 代码。 要查看源代码,请阅读 http://swampcastle.org/2015/07/28/writing-faster-modulestore-tests.html 上的原始博客文章

重要的是 Django ORM 操作保留在 设置(). 您在其中创建的任何模型 设置类() 必须在您的手动删除 撕裂类() 方法 - 共享模块存储测试用例 不会正确清理它们。 即使您很小心,您仍然可能以不可预知的方式破坏系统中的其他测试,因为它们对序列以及在设置数据时将创建什么 ID 做出了错误的假设。 调试起来可能非常乏味。

当我们升级到 Django 1.8 时,您将能够使用 设置测试数据() 使用自动清理安全地对 Django 模型进行类级初始化。 请等待升级并将模型操作放入 设置() 现在,即使它有点慢。

我应该转换哪些测试?

寻找测试优化目标最容易的地方是 Jenkins 测试构建报告. 单击“持续时间”以按该列排序。

Jenkins 服务器的屏幕截图,显示了运行时间最长的测试。

我们主要希望针对昂贵的测试,这些测试要么创建复杂的课程数据(例如 CCX),要么具有简单的课程数据但有很多很多的测试(例如讨论)。 即使是最简单的课程也需要大约 250-300 毫秒左右的时间,这在使用诸如 DDT 这有效地增加了一个类中的测试数量。

整体外卖

数据库访问是运行测试的昂贵部分,并且 模块存储 就是一个典型的例子。 我希望 共享模块存储测试用例 可以成为减少测试执行时间的有用工具。 但除此之外,我希望了解它的工作原理将使我们能够设计出更快的测试套件。

Dave Ormsbee 是 edX 的高级架构师。 这篇文章最初发表在他的博客上, 沼泽城堡.

装载

时间更多? 查看下面的文章。

企业学习进军教育科技
征文大丰收
打开 edX 论文征集:7 月 XNUMX 日结束
Open edX 的增量改进
参加 2026 年 Open edX 会议!

2026 年 Open edX 会议将展示世界上最好的开源在线学习管理系统之一 Open edX 平台的创新用例,并发现教学设计、课程群以及操作和扩展 Open edX 平台的方法方面的最新进展,包括突破性技术,例如生成式人工智能。