保定网站seo哪家公司好,石家庄网站建设蓝点,个人小白如何做手游代理,wordpress开发文档最近#xff0c;我一直在写与自动测试有关的更高级的概念#xff08;主要与Spock有关#xff09;。 但是#xff0c;在进行测试培训时#xff0c;我清楚地看到#xff0c;通常对特定工具的知识并不是主要问题。 即使使用Spock#xff0c;也可以编写肿且难以维护的测试我一直在写与自动测试有关的更高级的概念主要与Spock有关。 但是在进行测试培训时我清楚地看到通常对特定工具的知识并不是主要问题。 即使使用Spock也可以编写肿且难以维护的测试从而破坏或不了解与编写单元测试有关的良好实践。 因此我决定写一些更基本的东西来促进它们并且在指导经验不足的同事时准备使用一些参考材料。 介绍 编写良好的单元测试应满足几个要求这是整个系列的主题。 在这篇博客文章中我想提出一个相当成熟的概念即使用严格定义的功能依次是行为驱动开发的子集将单元测试划分为3个独立的块。 单元测试通常集中于测试给定单元通常是一个给定类的某些特定行为。 与通过UI执行的验收测试相反在每个测试中都将存根/模拟作为其合作者从零开始设置一个要测试的类被测类是便宜快速。 因此性能应该不是问题。 样品测试 为了演示规则我将使用一个小例子。 ShipDictionary是一个类可根据特定条件按名称的一部分生产年份等搜索太空船。 该词典由不同的船舶索引在役退役在生产等中的船舶提供动力。 在那个特定的测试中它被测试了按其名称的一部分搜索飞船的能力。 private static final String ENTERPRISE_D USS Enterprise (NCC-1701-D);Test
public void shouldFindOwnShipByName() {
//given
ShipDatabase shipDatabase new ShipDatabase(ownShipIndex, enemyShipIndex);
given(ownShipIndex.findByName(Enterprise)).willReturn(singletonList(ENTERPRISE_D));
//when
List foundShips shipDatabase.findByName(Enterprise);
//then
assertThat(foundShips).contains(ENTERPRISE_D);
}给定时间 测试驱动开发方法和行为驱动开发方法中都存在的良好习惯是“先验”知识将在特定测试用例中进行测试认定。 可以以更正式的方式例如用Cucumber / Gherkin编写的用于验收测试的方案或以自由形式例如特别注意的要点或只是下一步应该做什么的想法来完成。 有了这些知识就很容易确定整个测试将组成的三个关键部分分开的部分。 给定–准备 在单元测试的第一部分称为given 中需要创建一个实际对象实例在该对象实例上将执行测试的操作。 在重点单元测试中只有一类放置要测试的逻辑。 此外应将执行测试所需的其他对象称为协作者初始化为存根/模拟并适当存根如果需要。 还必须将所有协作者注入到要测试的对象中该对象通常与对象创建结合在一起因为构造函数注入应该是依赖注入的首选技术。 //given
ShipDatabase shipDatabase new ShipDatabase(ownShipIndex, enemyShipIndex);
given(ownShipIndex.findByName(Enterprise)).willReturn(singletonList(ENTERPRISE_D));何时–执行 在when部分中将执行要测试的操作。 在我们的情况下这是一个搜索请求然后将结果存储在变量中以供进一步声明。 //when
List foundShips shipDatabase.findByName(Enterprise); 在大多数情况下在该部分中仅执行一个操作是一件好事。 更多的元素可能表明尝试测试多个操作可能可以分为多个测试。 然后–断言 -最后一节的责任 then -主要是先前接收到的结果的断言。 它应该等于期望值。 //then
assertThat(foundShips).contains(ENTERPRISE_D); 另外可能有必要对声明的模拟执行方法执行的验证。 这不应该是一种普遍的做法因为在大多数情况下对接收值的声明足以确认所测试的代码按预期工作根据设置的边界。 但是尤其是在测试void方法时需要验证使用预期参数执行的特定方法。 AAA aka 3A –一种替代语法 正如我已经提到的BDD是一个更广泛的概念对于编写具有预先定义的需求通常以非技术形式的功能/验收测试而言BDD特别方便。 一种替代的测试划分语法对于各节而言具有非常相似的含义是通常将其缩写为AAA或3A的“ 排列动作声明” 。 如果您根本不使用BDD并且三个字母比GWT更容易记住那么使用它来创建相同的高质量单元测试就很好。 调整与优化 将实用工具和方法学与持续进行的技能获取过程也称为Dreyfus模型 进行匹配的过程已在《 实用思维与学习重构您的湿软件 》一书中进行了很好的描述。 当然在许多情况下使用测试的简化变体可能很方便 given节移到setup/init/before节或内联初始化。 同样可以适用于when和then部分其可以被合并在一起成expect部分特别是在参数化测试。 具有编写单元测试的经验和流利性使用速记和优化特别是测试一些非平凡的案例是完全有效的。 只要整个团队都了解约定并且能够记住有关编写好的单元测试的基本假设。 摘要 根据我在软件开发方面的经验以及作为一名培训师我清楚地看到将单元测试划分为多个部分可以使它们更短更易读尤其是团队中经验不足的人员。 用简单定义的责任来填充3个部分比立即找出并在测试中编写所有内容要容易得多。 最后特别是对于仅阅读本文第一部分和最后部分的人们此处遵循以下简明规则 given –测试中的对象初始化存根/模拟的创建存根和注入 when –在给定测试中进行测试的操作 then –收到结果声明模拟验证如果需要 PS最好在IDE中设置一个测试模板以保护编写每个测试所需的许多击键。 PSS我认为本文很有用您可以让我知道以激励我将来写更多有关单元测试的基础知识。 图片来源Tomas SobekOpenclipart https //openclipart.org/detail/242959/old-scroll 自我提升 。 您想快速有效地提高您和您的团队的测试技能以及对Spock / JUnit / Mockito / AssertJ的了解吗 我进行了浓缩单元 测试培训 您可能会觉得有用。 翻译自: https://www.javacodegeeks.com/2017/05/importance-given-unit-tests-tdd.html