6

したがって、ユーザーストーリーのシナリオに関しては、具体的にすることは良いことです。しかし、私は頻繁に自分自身に問いかけることになります。私のシナリオはどの程度具体的である必要がありますか?

たとえば、ユーザーストーリーの場合:

プロジェクトメンバーがプロジェクトで共同作業できるようにするために、プロジェクトマネージャーとして、新しいプロジェクトを登録できるようにしたいと思います。

次のシナリオが考えられます。

プロジェクトがシステムに登録されたことがない場合、プロジェクトマネージャーがそのプロジェクトを登録すると、登録されたプロジェクトが指定されたメンバーのプロジェクトリストに表示されます。

または、次のように具体的にすることもできます。

スコットがプロジェクトマネージャーであり、スタックオーバーフロー統合プロジェクトがシステムに登録されたことがない場合、スコットがジェーンをプロジェクトメンバーとして指定してスタックオーバーフロー統合プロジェクトを登録すると、スタックオーバーフロー統合プロジェクトがジェーンのプロジェクトリストに表示されます。

2番目の「より具体的な」ものはBDD仕様を書くときに便利だと思いました。projectManagerStubの代わりにscottTheProjectManagerのようなものがある場合:

  • より現実の世界に合わせて調整します(プロジェクトマネージャーとして機能するスタブはありません。それとも私たちですか?)
  • その仕様のコンテキストで必要なときにいつでも参照しやすくなります(それ以外の場合は、「そのプロジェクトマネージャー」または「プロジェクトを登録したプロジェクトマネージャー」などと言い続けます。

私は私の結論に正しいですか?ストーリーに変更が生じた場合、その特異性は私に害を及ぼしますか?

どうもありがとう!


アップデート

上記の質問は、役割名の代わりに個人名を使用することだけでなく、シナリオ内のすべてのプレースホルダーを実際のインスタンスの名前に置き換えることでもあります。実際には、Scottという人がプロジェクトマネージャーとして働いているという意味ではありません。前述の利点を実現するために、抽象的なプレースホルダーに名前を付けているだけです。

StoryQフレームワークを使用して完全なBDDスタイルの仕様を表す次のコードを含めることにより、これらの利点がどのように実現されるかを示します。

[TestFixture]
public class ProjectRegistrationSpecs
{
    [Test]
    public void ProjectRegistration()
    {
        new Story("Project Registration")
            .InOrderTo("allow project members to collaborate over a project")
            .AsA("project manager")
            .IWant("to be able to register new projects")
                .WithScenario("New Project Registration")
                    .Given(ScottIsAProjectManager)
                        .And(StackoverflowIntegrationProjectHasNeverBeenRegistered)
                    .When(ScottRegistersStackoverflowIntegrationProjectSpecifyingJaneAsAnAnalyst)
                    .Then(StackoverflowIntegrationProjectShouldAppearInJanesListOfProjects)
        .Execute();
}

//Since Scott and Jane are just instances that have meaning in the context of this user story only, they're defined private
private ProjectManager scottTheProjectManager;
private Project stackOverFlowIntegrationProject;
private Employee janeTheAnalyst; 

    //Initialize the stubs in the constructor
    public ProjectRegistrationSpecs()
    {
        scottTheProjectManager = new ProjectManager()
        {
            Id = new Guid("{A1596CFC-5FA5-4f67-AC7E-5B140F312D52}")
        };

        stackOverFlowIntegrationProject = new Project()
        {
            Id = new Guid("{F4CD5DDE-861E-4e18-8021-730B7F47C232}"),
            Name = "Stack Overflow Integration"
        };
    }
    private void ScottIsAProjectManager()
    {
        container.Get<IDataProvider>().Repository<ProjectManager>().Add(scottTheProjectManager);
    }
    private void StackoverflowIntegrationProjectHasNeverBeenRegisteredInTheSystem()
    {
        var provider = container.Get<IDataProvider>();
        var project = provider.Repository<Project>().SingleOrDefault(p => p.Name == stackOverFlowIntegrationProject.Name);
        if (null != project)
        provider.Repository<Project>().Delete(project);
    }
    private void ScottRegistersStackoverflowIntegrationProjectSpecifyingJaneAsAProjectMember()
    {
        stackOverFlowIntegrationProject.Members.Add(janeTheAnalyst);
        scottTheProjectManager.RegisterProject(stackOverFlowIntegrationProject);
    }

    //instead of saying something like TheProjectThatWasAddedByTheProjectManagerShouldAppearInTheProjectMembersList, we have: 
    private void StackoverflowIntegrationProjectShouldAppearInJanesListOfProjects()
    {
        Assert.That(janeTheAnalyst.Projects.Any(p => p.Id == stackOverFlowIntegrationProject.Id));
    }
}
4

5 に答える 5

3

あなたが与える最初の「シナリオ」は、実際には受け入れ基準です。これは、すべてのタイプのプロジェクト マネージャー、メンバー、および指定されたプロジェクトに対して機能するルールを指定します。

2 番目のシナリオは、実際のデータを使用した実際の承認基準の例です。BDD の最も重要な側面は、会話の中でこのような例を使用して、ストーリーの受け入れ基準の他の側面について議論できるようにすることです。

たとえば、stackoverflow 統合プロジェクトが既に登録されている場合、Scott が再度登録しようとするとどうなりますか? Jane のプロジェクトへの割り当てを拒否できるシナリオはありますか? プロジェクトへのジェーンの割り当ては、唯一の価値ある結果ですか? 彼女はそれについてメールを受け取りますか?

シナリオについて議論するときに、特定のデータを使用する方がはるかに簡単であることが、すでにおわかりでしょう。次のことも覚えておいてください。

  • 会話をすることはより重要です
  • よりも重要な会話をキャプチャする
  • 会話の自動化

3 つすべてを同時に行うことができれば称賛に値しますが、自動化のために会話に妥協しないでください。

于 2011-04-07T14:19:51.940 に答える
2

「ユーザー ペルソナ」は非常に強力ですが、習得が難しい概念です。正しく行えば、シンプルで最適化されたユーザー エクスペリエンスに向けて誘導できます。間違ったやり方をすると、時間がかかり、チームのメンバーに互いに怒鳴る主観的な理由を与えてしまいます。

出発点としてhttp://www.agile-ux.com/2009/12/02/personas-in-agile-development-yes-we-can/をチェックしてください。ほとんどがBDDに固有のものではありませんが、このトピックに関する文献はたくさんあります。

私ができる最も重要なアドバイスは、あなたのペルソナを定義するとき、何が彼らを喜ばせ、動機づけ、苛立たせるかについて非常に具体的にすることが重要であるということです。これらのことを製品の特定の側面や製品に対する個人的な願望に結び付けないでください。そうしないと、1) ペルソナがすぐに時代遅れになり、再作成する必要が生じ、2) その人物が主観的な武器として使用されてしまい、個人的なものを促進することになります。現実の人々にとって可能な限り最高の製品を改善するための事実に基づくツールとしてではなく、願望。これは言うは易く行うは難しです。

于 2011-04-03T04:21:56.927 に答える
1

It is good to use names for the roles there, as they make it easier to understand the story; they engage more of your primate brain, for it loves individuals and hates abstraction. However, you must take care! Try to ensure that the names you use don't match the name of anyone you're actually work with – that'd be horribly confusing – and don't encode prejudices – the project is not a prejudiced thing, as it can't have opinions. Also don't use the same name for different roles; while reality might be a messy mix with people having many roles, the user stories should not be mixed up that way because it's just plain confusing.

于 2011-04-03T07:15:23.700 に答える
1

あなたの例から以下を比較してください:

Scott がプロジェクト マネージャーであり、stackoverflow 統合プロジェクトがシステムに登録されていない場合、Scott が Jane をプロジェクト メンバーとして指定して stackoverflow 統合プロジェクトを登録すると、stackoverflow 統合プロジェクトが Jane のプロジェクトのリストに表示されます。

VS:

プロジェクト マネージャーと未登録のプロジェクトがある場合、プロジェクト マネージャーがプロジェクトを登録し、チーム メンバーを指定すると、プロジェクトはチーム メンバーのプロジェクト リストに表示されます。

上記の 2 番目の例の言い回しは、質問で示した最初の例とあまり変わらないことに注意してください。ある意味、これはあなたが欠けていると感じるかもしれないと思います. もしそうなら、私はそれを一種の「物語の匂い」として扱います.ストーリー/シナリオがより完全に感じられます。

個人的には、ペルソナを使用すると目前のタスクから気をそらすことがわかります。テスト コードが、テスト対象のものに属しているかのように読めないテキストで散らばってしまうのは好きではありません。一方、データ駆動型のアプローチを採用していて、目的のためにある種のデータ構造を定義している場合は、その構造に、テスト対象のスコープ内で意味のある名前を設定することは理にかなっています。

ペルソナを使用するリスクの 1 つは、時として怠惰なメソッド命名の代用になってしまうこと、さらに悪いことに、退屈なプログラマーが自分のコードに少しユーモアを入れようとする手段になってしまうことだと思います。自分の名前を少し楽しむのが悪いとは思いませんが、利害関係者に価値を提供しないのであれば、名前を使用すべきではありません。

しかし、私には別の考えが浮かびます。それは、両方の長所を活かすことができるということです。ストーリー シナリオにフィードするデータとしてユーザー ペルソナを指定すると、コードをクリーンで要点を維持できるという利点がありますが、実際のテスト実行に関して、出力をもう少し具体的に見せることができます。例えば:

new Story("Project Registration")
        .InOrderTo("allow project members to collaborate over a project")
        .AsA("project manager")
        .IWant("to be able to register new projects")
            .WithScenario("New Project Registration")
                .Given(AProjectManager, "Scott")
                    .And(AnUnRegisteredProject, "Stack Overflow Integration")
                .When(TheProjectManagerRegistersTheProject)
                    .And(TheProjectManagerSpecifiesATeamMember, "Jane")
                .Then(ThenTheProjectShouldAppearInTheTeamMembersListOfProjects)
    .Execute();
于 2011-10-08T09:30:53.050 に答える
0

名前付きの特定のユーザーベイを持つアプローチは、ドメインの専門家にとってはるかに理解しやすいものですが (ドメインの専門家は *Scott_the_project_manager* と彼のタスクを知っているため)、このアプローチは Single_responsibility_principle に違反していると思います: 1 人が複数の役割を持つことができます。

Scott はマーケティングにも関与している可能性があり、*Magret_the_project_manager* は Scott とは異なる責任を負っている可能性があります

于 2011-04-03T06:40:38.887 に答える