testing驱动的开发 – 如何在没有任何实现代码存在的情况下编写testing

我正在学习TDD,但由于不直截了当,所以很难接受。

我无法回答的问题是“ 如何在任何实现代码存在之前编写testing? ”。

如果我们的目标类/目标方法/目标参数types/目标返回types不存在,

  • 在testing中编写代码时我们所指的是什么。 我们如何开始写testing?
  • 如果我们所能写的只是testing方法的名称,那么testing失败了怎么办?

每个人都告诉为什么,但不是如何

我已经尽了最大的努力去寻找资源,详细说明在生产代码之前编写testing的问题,但是假设我错过了很好的资源,其中大多数都充满了陈词滥调,解释为什么TTD比重点关注采用它的实践更重要。

一个示例用例。

假设我们正在为大学开发一个软件,我们的用例是课程注册。

为了简单起见,让我们限制这个讨论

  • 情景:“学生每学期最多可以选修3门课程”
  • testing服务层和dao层。

伪代码

ENROLL(studentId, courseId) //check if student enrolled in less than 3 courses in the same semester as given courseId belongs in. //if yes, enroll him/her. //if not, return an error. 

上面的实际实现可能涉及到几个涉及服务,道教等的类。

请你能解释一下如何进行testing驱动 – 逐步开发它? 如果你使用TDD来实现这个function,那么你怎么一步一步地做到这一点。

我希望这可以在未来帮助像我这样的斗争。

在与EnrollingService相同的包中,在src / test / java中创buildEnrollingServiceTest类

 class EnrollingServiceTest { private EnrollingService enrollingService; @Before public void init() { enrollingService = new EnrollingService(); } @Test public void testEnroll() { boolean result = enrollingService.enroll(1l, 1l); assertTrue(result); ... 

IDE(我假设你正在使用IDE)显示错误 – EnrollingService不存在。

将光标指向EnrollService – IDE将提供创build类 – 让它在src / main / java中创build

现在IDE说注册(long,long)方法丢失 – 让IDE为你创build。

现在IDE显示没有错误。 运行testing – 失败。 去注册并开始实施逻辑

等等…

当你关注代码的预期行为而不是代码的实现时,这将变得更加清晰。 所以考虑到你所概述的情况,你可能得出的结论是,你将不得不在某些类中编写enroll()方法。 然后你可以考虑如何去testing这个课程。

你首先考虑class级的条件以及期望的条件。 也许你可以确定类的某些不variables。 在这种情况下,为了testing这个类,你可以考虑这种不变的方式。

因此,声明:一个学生可能每个学期最多注册三门课程,你会考虑这种情况的发生。

  1. 学生在给定学期注册0门课程,尝试注册课程,结果:注册成功; 学生现在已经注册了一个学期的一门课程。
  2. 学生一学期注册1门课程,试图注册课程,结果:注册成功; 学生现在已经注册了2学期给定的学期。
  3. 学生注册三个课程给定的学期,试图注册一门课程,结果:失败(也许是exception被抛出?)
  4. 等等

接下来你真的写这些testing。 这些都可以是一种testing方法。 因此,testing方法将确保创build对象并按预期设置环境。 然后调用该方法并将结果与​​预期结果进行比较。 如果你期望发生的事情真的发生,那么testing通过。

现在,最初,因为您还没有写出testing方法实际上不会传递的方法。 但是当你开始编写代码时,你的testing将会开始通过,并且最终100%的testing都会通过,你会满意你的代码符合要求。

 public void shouldNotEnrollInMoreThanFourClassesInASemester() { Enroller enroller = new Enroller(); Student student = new Student(); Semester one = new Semester(); Semester two = new Semester(); Course geology = new Course(one); Course architecture = new Course(one); Course calculus = new Course(one); Course sociology = new Course(one); Course geometry = new Course(two); assertOk(enroller.enroll(student, geology)); assertOk(enroller.enroll(student, architecture)); assertOk(enroller.enroll(student, calculus)); assertNotOk(enroller.enroll(student, sociology)); assertOk(enroller.enroll(student, geometry)); } 

在你的场景中,你应该分别testing每个图层,所以在testing服务层的时候嘲笑dao。

当你第一次写testing时,它不会被编译,这意味着它失败了,但是这很好,因为类不存在。

在你的例子中哪一层最多应该注册3个课程? 这将影响你如何testing。

先写testing将帮助你解决这些types的问题。

如前所述,这是一个明确的答案太开放,但如果你开始写你的testing,然后作为一个更新发布它可以帮助。

所以,编写你的daotesting然后编写类和方法来编译它,但是它应该仍然失败,直到yiu完成实现。 你可能想要testing2,3,4类注册,并确保每个注册失败,然后完成实施。