Performance 标记单元测试

Performance 标记单元测试,performance,unit-testing,continuous-integration,phpunit,tagging,Performance,Unit Testing,Continuous Integration,Phpunit,Tagging,我正在从事一个PHP项目,该项目具有可靠的单元测试覆盖率 我注意到,上一次,我使用单元测试命令行测试运行程序--filter命令进行了非常棘手的操作 以下是官方文档中对该命令的解释: --滤器 仅运行名称与给定模式匹配的测试。模式可以是单个测试的名称,也可以是匹配多个测试名称的正则表达式 我经常使用它,因为有时候从整个测试库中运行单个测试套件或测试用例会变得非常有用 我想知道这是不是一个好的做法 我听说,有时在持续集成机器上运行整个测试套件是一种很好的做法,如果您确信您只修改了一个组件,并且10

我正在从事一个PHP项目,该项目具有可靠的单元测试覆盖率

我注意到,上一次,我使用单元测试命令行测试运行程序--filter命令进行了非常棘手的操作

以下是官方文档中对该命令的解释:

--滤器

仅运行名称与给定模式匹配的测试。模式可以是单个测试的名称,也可以是匹配多个测试名称的正则表达式

我经常使用它,因为有时候从整个测试库中运行单个测试套件或测试用例会变得非常有用

我想知道这是不是一个好的做法

我听说,有时在持续集成机器上运行整个测试套件是一种很好的做法,如果您确信您只修改了一个组件,并且100%确信它不会通过其他组件的单元测试。 你觉得怎么样

不久前,我认为我们不应该太在意运行整个单元测试套件所需的时间,但是当您有非常复杂的业务逻辑和单元测试时,这可能需要大量的时间

我理解,“真正的”单元测试不应该与DB交互,而应该使用mock/stubs对象,我同意这一点。但有时,使用DB夹具进行测试要容易得多(便宜得多)


请给我一些建议,如何解决这个问题?

好的单元测试应该:

  • 有清晰的方法名和变量名作为文档
  • 快跑。这也是可能的 用于复杂业务的测试 逻辑。测试应以平均速度运行 大约0.1秒的时间
  • 在一种测试方法中只测试一件事
  • 不与文件系统、电子邮件、, 数据库、Web服务和 其他一切。您可以创建 独立数据库集成测试 以测试数据库操作。 这些测试将比你的单位慢 大部分时间都在测试。我把我的 在一个单独的环境中进行集成测试 项目,我只在我 正在处理集成代码。我 还可以在CI上的所有构建上运行它们 服务器
  • 彼此完全隔离。当你有考试的时候 在对方身上,你看不到什么 你的问题在于读哪本书 测试失败。你可能不得不 调试以查找问题。孤立的 测试将为您节省大量时间
就个人而言,我在测试中不使用类别名称。每个应用程序使用2个测试项目。一个用于单元测试,一个用于集成测试和较慢的测试

对以下事项的反应:

“但有时,这很重要 更容易(更便宜)使用DB固定装置 测试。”

当你的代码写得好的时候,模仿就容易多了。我不知道如何在Php中模拟框架,但我在其他语言中使用它们来节省大量时间。先编写测试,然后编写代码可能会帮助您将代码设计为更易于测试

就我个人而言,我学会了通过

  • 阅读有关它的博客
  • 读关于它的书
  • 阅读他人编写的测试代码
  • 当然,写了很多测试。我花了几千次的考试才学好它
我经常使用它,因为有时候从整个测试库中运行单个测试套件或测试用例会变得非常有用

我想知道这是不是一个好的做法

当然,只要您偶尔运行全套单元测试(通过CI服务器听起来很完美)


定期运行“有趣的”测试比很少运行所有测试要好。

我想通过在提交之前必须运行一部分测试(“冒烟测试”)来解决这个问题,这些测试需要1分钟或更少的时间,然后从您的CI服务器运行全套测试

如果您的整套测试花费的时间超过15分钟,那么我会将它们分开并并行运行


然后,您可以使用--filter先运行您最感兴趣的测试,然后在提交之前运行冒烟测试,然后从CI服务器运行其余测试。

hm。。关于将快速和慢速测试拆分为不同的项目,这对我来说是一个非常新的想法。而且也很有趣。看起来测试速度比较慢,因为它们不是单元测试,而是集成测试,正如您前面所说的。非常感谢。