Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 进食、睡眠和呼吸单元测试/TDD/BDD_Java_Unit Testing_Grails_Tdd_Bdd - Fatal编程技术网

Java 进食、睡眠和呼吸单元测试/TDD/BDD

Java 进食、睡眠和呼吸单元测试/TDD/BDD,java,unit-testing,grails,tdd,bdd,Java,Unit Testing,Grails,Tdd,Bdd,我在编写API和核心功能时编写单元测试。但我想成为一个吃、睡、呼吸TDD和BDD的酷粉丝。从正确的方式开始使用TDD/BDD的最佳方式是什么?有任何书籍、资源、框架和最佳实践吗 我的环境是Java后端和Grails前端,与几个外部web服务和数据库集成。最佳实践IMHO:做实际的事情,而不仅仅是因为它是一个过程。不要忘记编写应用程序的目标是什么,在商业世界中,它不是编写测试。别误会我的意思,他们有自己的位置,但这不应该是目标。我认为,指标是从这里到那里的最佳方式。跟踪代码的覆盖情况,为每次提交保

我在编写API和核心功能时编写单元测试。但我想成为一个吃、睡、呼吸TDD和BDD的酷粉丝。从正确的方式开始使用TDD/BDD的最佳方式是什么?有任何书籍、资源、框架和最佳实践吗


我的环境是Java后端和Grails前端,与几个外部web服务和数据库集成。

最佳实践IMHO:做实际的事情,而不仅仅是因为它是一个过程。不要忘记编写应用程序的目标是什么,在商业世界中,它不是编写测试。别误会我的意思,他们有自己的位置,但这不应该是目标。

我认为,指标是从这里到那里的最佳方式。跟踪代码的覆盖情况,为每次提交保留代码复杂性增量,使用测试运行程序监视代码的更改,并不断重新运行相应的测试。永远不要让测试长度超过几行,这样所有工具都能正常工作。我建议每个月休息一天,通过变异测试仪运行代码。这一天应该只用于编写测试。如果你还没有做好TDD,所有这些都会给你带来痛苦。从痛苦中学习,很快你就会做对的


永远不要忘记测试的目的:描述期望的行为。它们是您的可执行规范。(这也是我喜欢的原因;现在你可以让你的PHB为你编写测试了!好吧,也许不是很好,但很接近!)

对于开始做单元测试,然后阅读如何正确地进行测试,最后教你的团队如何进行TDD并让他们参与进来——因为根据我的经验,没有什么比与整个团队一起进行单元测试更重要的了

您还需要一个适当的构建过程——使用构建服务器构建代码并运行testst,我建议使用TeamCity(无限制)

学习如何纠正好的单元测试是困难的部分——其中一些你将自己学习(只要你保持单元测试),其余的你可以通过搜索互联网来学习


如果不把编写单元测试作为开发的一部分,你就会知道你已经达到了目标。记住,敏捷意味着你不会完全放弃任何特定的方法。如果你正在做一些TDD的好处不值得的事情(比如在Swing界面上进行试错编辑),那么就不要使用TDD。

找一个做过TDD/BDD的人,并与他们配对编程

我不喜欢人们说“练习X从来都不是坏事;如果它不起作用,你就做得不对。”对不起,这和其他狂热的宗教教条有着同样的感觉。我不相信

我同意一些人的观点,他们说,你的时间和金钱所能负担得起的最佳解决方案应该是目标

任何反对TDD的人都不应自动被指责忽视质量。(“那你什么时候停止打你妻子了?”)事实是,软件中有缺陷,消除所有缺陷的成本必须与收益进行权衡

制造业也是如此。尺寸公差和表面光洁度不尽相同,因为有时不保证紧密公差和镜面光洁度

是的,我写单元测试,虽然在我写类之前并不经常。我已经看到了测试对设计的影响。我测量并观察代码覆盖率。如果我发现我的覆盖率不可接受,我会编写更多的测试。我理解重构的单元测试安全网的好处。即使在我独自工作的时候,我也会遵循这些做法,因为我亲身体验了这些好处。我明白了

但我会对任何一个开始烦我“吃饭、睡觉、呼吸单元测试和TDD”的队友表示怀疑

我的经理说,唯一能让我升职的方法就是让团队进入TDD/BDD

有没有想过这会让你听起来像个讨厌鬼?你是否发现你的唠叨疏远了你团队的其他成员

这种反应可能会让我失去一些声誉点,但不得不说

我认为更好的方法是自己练习,让别人看到好处。以身作则。这比你说的更有说服力

哎呀,Grails内置了测试生成。如果你在一个使用Grails的团队中工作,那么还需要多少销售?

“PS:我的经理说,让我升职的唯一方法是让团队进入TDD/BDD。”

让一个团队去做某事(在这个过程中不会杀了你)的唯一现实的方法是向他们清楚地证明改变他们的习惯对他们是有好处的。换句话说,编写代码。很多代码。大量的代码。然后,当关键的电子邮件到达,彻底改变了规范时,向他们展示你可以通过重构轻松地更改代码,更糟糕的是,你已经准备好了测试。酒吧是绿的,黑的,红的!!!!,哈克哈克,绿色酒吧,回家

阅读Kent Beck关于测试驱动设计的书。从测试开始,然后执行代码。让运行测试的构建服务器运行!你不需要为整个团队准备,而是为自己准备,并向他们展示它的帮助


说教只会惹恼当地人:)

一个好的开始就是阅读博客。然后买那些写博客的人的书。我极力推荐一些:

“鲍勃叔叔”马丁和Object Mentor的同事们:

注意:获取Bobs图书清洁代码:

我的朋友蒂姆·奥廷格(前对象导师杜德)

喷气式飞机的家伙们:

我觉得有必要对此进行扩展,因为其他人似乎只是想给你他们对TDD的看法,而不是帮助你成为绝地忍者。TDD i的迈克尔·乔丹
using MavenThought.Commons.Testing;
using SharpTestsEx;

namespace Price.Displacement.Module.Designer.Tests.Model.Observers
{
    /// <summary>
    /// Specification when diffuser observer is created
    /// </summary>
    [ConstructorSpecification]
    public class When_diffuser_observer_is_created
        : DiffuserObserverSpecification
    {
        /// <summary>
        /// Checks the diffuser injection
        /// </summary>
        [It]
        public void Should_return_the_injected_diffuser()
        {
            Sut.Diffuser.Should().Be.SameInstanceAs(this.ConcreteDiffuser);
        }
    }
}
using System.ComponentModel;
using MavenThought.Commons.Events;
using PostSharp;
using Price.Displacement.Core.Products;
using Price.Displacement.Domain;

namespace Price.Displacement.Desktop.Module.Designer.Model.Observers
{
    /// <summary>
    /// Implementation of current observer for the selected product
    /// </summary>
    public class DiffuserObserver : AbstractNotifyPropertyChanged, IDiffuserObserver
    {
        /// <summary>
        /// gets the diffuser
        /// </summary>
        public IDiffuser Diffuser { get; private set; }

        /// <summary>
        /// Initialize with a diffuser
        /// </summary>
        /// <param name="diffuser">The diffuser to observe</param>
        public void Initialize(IDiffuser diffuser)
        {
            this.Diffuser = diffuser;
            this.NotifyInterface().PropertyChanged += (x, e) => this.OnPropertyChanged(e.PropertyName);
        }

        /// <summary>
        /// Gets the notify interface to use
        /// </summary>
        /// <returns>The instance of notify property changed interface</returns>
        protected INotifyPropertyChanged NotifyInterface()
        {
            return Post.Cast<Diffuser, INotifyPropertyChanged>((Diffuser)Diffuser);
        }
    }
}