这是我第一次尝试TDD。
第一次,我的控制器测试如下所示
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的数量。
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()。但是,我想知道这是否是正确的方式,或者这实际上是一个反模式。
请向我解释什么,怎么做,为什么要考试?
发布于 2019-07-31 12:41:08
我很困惑。您的类名是ControllerCustomerIndustryTest,但是您似乎正在测试您是否有一个数据库。你应该测试你的控制器逻辑。不是数据库连接。
每个测试花费4-6秒是不可接受的,但是让它们在一秒钟内完成并不能弥补您仍然没有编写单元测试的事实。并不是每个自动化测试都是单元测试。您可以编写集成测试,但在您花费大量时间和精力进行集成测试之前,我鼓励您掌握真正的隔离单元测试。
Michael给了相当好的提纲一个单元测试不应该做的事情:
在以下情况下,测试不是单元测试:
与不遵循这些规则的测试相比,您更喜欢遵循这些规则的测试。您应该发现它们运行得很快,并且很少有东西不能这样进行测试。
发布于 2019-08-03 11:15:54
请向我解释什么,怎么做,为什么要考试?
通常,在这种情况下,我们会将解决方案的设计分为两部分。
这是“测试驱动设计”要点的一部分;我们在需求中包含了代码易于测试的约束条件。这通常采取将逻辑(对内存中的值进行操作)与副作用(读取和写入数据库)分离的形式。
表达这种想法的另一种方式是:我们有两种不同的测试,一种是需要副作用的测试,比如从数据库中读取数据,另一种是可以使用内存中的信息来运行的测试。我们要做的是安排我们的代码,这样所有复杂的逻辑都可以通过第二种测试来测量,这样就可以更快、更便宜。
请参阅Gary的talk 边界,了解有关将与数据库对话的比特( "shell")与只需要内部内存(“核心”)的比特分离的更多细节。
马克·塞曼( Mark )的异步注入演讲或许也有帮助,但你可能需要更加努力地研究这些想法如何适合你的问题。
https://softwareengineering.stackexchange.com/questions/395391
复制相似问题