首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉氏控制器测试

拉氏控制器测试
EN

Software Engineering用户
提问于 2019-07-31 02:47:48
回答 2查看 100关注 0票数 1

这是我第一次尝试TDD。

第一次,我的控制器测试如下所示

代码语言:javascript
复制
use RefreshDatabase;
class ControllerCustomerIndustryTest extends TestCase
{
    use RefreshDatabase;

    public function testIndex()
    {
        // 
    }

    public function testStore()
    {
        // 
    }

    public function testShow()
    {
        // 
    }

    public function testUpdate()
    {
        // 
    }

    public function testDelete()
    {
        //
    }
}

每个测试只需4-6秒就可以完成这个基本功能。

然后我尝试改变结构以减少RefreshDatabase的数量。

代码语言:javascript
复制
use RefreshDatabase;
class ControllerCustomerIndustryTest extends TestCase
{
    use RefreshDatabase;

    public function testCustomerIndustryController()
    {
        $this->store();
        $this->show();
        $this->update();
        $this->delete();
        $this->index();
    }

    private function index()
    {
        // 
    }

    private function store()
    {
        // 
    }

    private function show()
    {
        // 
    }

    private function update()
    {
        // 
    }

    private function delete()
    {
        //
    }
}

现在,每个测试运行不到1秒,因为refreshDatabase只执行了一次,我只需复制粘贴,并使用相同的数据存储()、显示()和update()。但是,我想知道这是否是正确的方式,或者这实际上是一个反模式。

请向我解释什么,怎么做,为什么要考试?

EN

回答 2

Software Engineering用户

发布于 2019-07-31 12:41:08

我很困惑。您的类名是ControllerCustomerIndustryTest,但是您似乎正在测试您是否有一个数据库。你应该测试你的控制器逻辑。不是数据库连接。

每个测试花费4-6秒是不可接受的,但是让它们在一秒钟内完成并不能弥补您仍然没有编写单元测试的事实。并不是每个自动化测试都是单元测试。您可以编写集成测试,但在您花费大量时间和精力进行集成测试之前,我鼓励您掌握真正的隔离单元测试。

Michael给了相当好的提纲一个单元测试不应该做的事情:

在以下情况下,测试不是单元测试:

  • 它与数据库对话
  • 它通过网络进行通信。
  • 它触及文件系统
  • 它不能与任何其他单元测试同时运行
  • 您必须对您的环境执行特殊的操作(例如编辑配置文件)才能运行它。

与不遵循这些规则的测试相比,您更喜欢遵循这些规则的测试。您应该发现它们运行得很快,并且很少有东西不能这样进行测试。

票数 1
EN

Software Engineering用户

发布于 2019-08-03 11:15:54

请向我解释什么,怎么做,为什么要考试?

通常,在这种情况下,我们会将解决方案的设计分为两部分。

  • 其中一个部分了解数据库,但非常简单。
  • 其中一个部分很复杂,但可以在内存中运行,而不需要与数据库对话。

这是“测试驱动设计”要点的一部分;我们在需求中包含了代码易于测试的约束条件。这通常采取将逻辑(对内存中的值进行操作)与副作用(读取和写入数据库)分离的形式。

表达这种想法的另一种方式是:我们有两种不同的测试,一种是需要副作用的测试,比如从数据库中读取数据,另一种是可以使用内存中的信息来运行的测试。我们要做的是安排我们的代码,这样所有复杂的逻辑都可以通过第二种测试来测量,这样就可以更快、更便宜。

请参阅Gary的talk 边界,了解有关将与数据库对话的比特( "shell")与只需要内部内存(“核心”)的比特分离的更多细节。

马克·塞曼( Mark )的异步注入演讲或许也有帮助,但你可能需要更加努力地研究这些想法如何适合你的问题。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/395391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档