gpt4 book ai didi

php - 我应该对每段代码进行单元测试吗

转载 作者:可可西里 更新时间:2023-11-01 00:44:53 26 4
gpt4 key购买 nike

我最近开始进行单元测试,想知道我是否应该编写 100% 代码覆盖率的单元测试?

当我最终编写的单元测试代码多于生产代码时,这似乎是徒劳的。

我正在编写一个 PHP Codeigniter 项目,有时似乎我写了这么多代码只是为了测试一个小功能。

例如这个单元测试

public function testLogin(){
//setup
$this->CI->load->library("form_validation");
$this->realFormValidation=new $this->CI->form_validation;
$this->CI->form_validation=$this->getMock("CI_Form_validation");
$this->realAuth=new $this->CI->auth;
$this->CI->auth=$this->getMock("Auth",array("logIn"));
$this->CI->auth->expects($this->once())
->method("logIn")
->will($this->returnValue(TRUE));

//test
$this->CI->form_validation->expects($this->once())
->method("run")
->will($this->returnValue(TRUE));
$_POST["login"]=TRUE;
$this->CI->login();
$out = $this->CI->output->get_headers();
//check new header ends with dashboard
$this->assertStringEndsWith("dashboard",$out[0][0]);

//tear down
$this->CI->form_validation=$this->realFormValidation;
$this->CI->auth=$this->realAuth;

}
public function badLoginProvider(){
return array(
array(FALSE,FALSE),
array(TRUE,FALSE)
);
}
/**
* @dataProvider badLoginProvider
*/
public function testBadLogin($formSubmitted,$validationResult){
//setup
$this->CI->load->library("form_validation");
$this->realFormValidation=new $this->CI->form_validation;
$this->CI->form_validation=$this->getMock("CI_Form_validation");

//test
$this->CI->form_validation->expects($this->any())
->method("run")
->will($this->returnValue($validationResult));
$_POST["login"]=$formSubmitted;
$this->CI->login();
//check it went to the login page
$out = output();
$this->assertGreaterThan(0, preg_match('/Login/i', $out));

//tear down
$this->CI->form_validation=$this->realFormValidation;
}

对于这个生产代码

public function login(){
if($this->input->post("login")){
$this->load->library('form_validation');
$username=$this->input->post('username');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', "required|callback_userPassCheck[$username]");
if ($this->form_validation->run()===FALSE) {
$this->load->helper("form");
$this->load->view('dashboard/login');
}
else{
$this->load->model('auth');
echo "valid";
$this->auth->logIn($this->input->post('username'),$this->input->post('password'),$this->input->post('remember_me'));
$this->load->helper('url');
redirect('dashboard');
}
}
else{
$this->load->helper("form");
$this->load->view('dashboard/login');
}
}

我哪里错了?

最佳答案

在我看来,测试代码多于生产代码是正常的。但是测试代码往往很简单,一旦掌握了它,编写测试就像是一项轻而易举的任务。

话虽如此,如果您发现您的测试代码太复杂而无法编写/无法涵盖生产代码中的所有执行路径,那么这是进行某些重构的一个很好的指标:您的方法可能太长,或者尝试执行多个东西,或者有这么多的外部依赖,等等......

另一点是,测试覆盖率高是好事,但不需要达到 100% 或某个非常高的数字。有时会有一些没有逻辑的代码,比如简单地将任务委托(delegate)给其他人的代码。在这种情况下,您可以跳过测试它们并使用 @codeCoverageIgnore 注释在您的代码覆盖范围内忽略它们。

关于php - 我应该对每段代码进行单元测试吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21970815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com