2

我在 Python - Django 网站上工作。我使用 GIT 作为我的 VCS。对于持续集成,我使用 Jenkins CI。我使用 Python 设置了两个虚拟环境,一个用于开发,另一个用于预生产。

我的问题:我为网站编写了许多单元测试、回归和冒烟测试。我的开发和预生产 virtualenvs 都连接到 Jenkins CI。

最近,每当将代码更改推送给 Jenkins CI 中的两种环境时,测试都会随机失败。有时,测试随机失败,没有任何代码更改被推进。

已完成故障排除:

  • 在本地运行测试,他们通过了。
  • 在 Jenkins CI 中手动构建了一些(使用立即构建按钮)测试通过了。
  • 单独运行失败的测试,它们仍然通过。

在早期版本中失败的测试在下一个版本中通过。一些在早期版本中通过的测试在下一个版本中失败了。有人可以建议我能做什么吗?

4

1 回答 1

9

您将必须确定导致测试随机失败的环境因素。

我看到的一些事情导致了这个:

  • 内存 - CI 机器上运行着其他东西,它没有足够的内存来完成所有这些并构建你的东西
  • 时间 - 您的代码中的某些内容会根据时间而失败。例如,我的代码会在 2 月 29 日失败。成功后,它让我们感到惊讶。如果只有一位数字,则可能类似于无法格式化秒数。
  • 外部依赖项-您的测试依赖于其他一些服务器。如果它出现故障或变得非常忙碌,它不会响应您的测试代码并且测试失败。这可能是一个数据库服务器。
  • 数据库内容 - 您可能没有为针对数据库运行的测试正确设置所有先决条件
  • 并发性——有时多线程代码只会在条件正确(或错误)时才会失败。外部因素引入的一点随机延迟可能会使代码工作或失败。它很容易忽略多线程代码中的竞争条件。
  • 服务器(或 CPU)- 如果测试在测试机器中的特定服务器或核心上运行,有时测试会失败。当然,如果你只有一台测试机,这是不可能发生的。但是,如果一台机器出现故障、连接性差(防火墙规则)、其他进程正在运行、内存更少(或更多),那么当您的测试被随机分配到该机器上运行时,它们可能会失败。
  • [在此处插入您的] - 还有一百万。

这些都是很难解决的问题。特别是如果他们无缘无故离开。它让你感到紧张,因为你怀疑它会在你急于修复生产系统中的一个讨厌的错误时回来。

于 2012-12-31T20:31:49.213 回答