php Codecrement中的@depends注解不适用于来自不同类的测试

vsmadaxz  于 2023-02-15  发布在  PHP
关注(0)|答案(2)|浏览(113)

我在tests\api\LoginCest.php中进行了以下测试:

class LoginCest {

   public function login( ApiTester $I ) {
      $I->assertTrue( true );
   }

}

这个测试在另一个类tests\api\UpdateUserCest.php中:

class UpdateUserCest {

   /**
    * @depends LoginCest:login
    */

   public function updateUser( ApiTester $I ) {
      $I->assertTrue( true );
   }

}

注意,在@depends注解中,我使用了第一个测试签名LoginCest:login,如Codectrice文档中所建议的:
@depends适用于Cest和Codecrect\Test\Unit格式。可以在不同的类之间设置依赖关系。要从另一个文件指定依赖测试,您应该提供测试签名。通常,测试签名与className:methodName格式匹配。但要获得确切的测试签名,只需使用--steps选项运行测试即可查看:
我已经验证了第一个测试的签名是LoginCest:login。但是当我运行第二个测试时,它失败了,因为它说第一个测试被跳过。更准确地说,控制台说:
更新用户测试:更新用户签名:更新用户测试:更新用户测试:tests/api/updateUserCest.php:更新用户场景--
跳过:此测试取决于LoginCest:testLogin是否通过
然后:
有1个跳过的测试:- --------1)更新用户测试:更新用户测试tests/api/UpdateUserCest. php:updateUser此测试依赖于LoginCest:login才能通过
可以,但不完整、跳过或有风险的测试!测试:1、Assert:0,跳过:1.
我错过了什么?

kognpnkq

kognpnkq1#

@depends表示,如果您所依赖的测试成功通过,则仅执行测试。
因此,在示例中,如果希望在调用“updateUser”之前调用“login”,则应该使用注解@before
第二件事是,我猜这个行为只有在两个方法都在同一个测试类中时才有效,所以这应该是work:

class UpdateUserCest
{
    public function login(ApiTester $I)
    {
        $I->assertTrue(true);
    }

    /**
     * @before login
     */
    public function updateUser(ApiTester $I)
    {
        $I->assertTrue(true);
    }
}

现在你可以显式地运行你的更新用户测试,并且可以确定,登录方法在之前被调用了。
codecept.phar run test/api/UpdateUserCest.php:updateUser

nvbavucw

nvbavucw2#

按照AdvancedUsage - Codeception 4 Documentation
要从另一个文件指定依赖测试,您应该提供测试签名。通常,测试签名与className:methodName格式匹配。但是要获取确切的测试签名,只需使用--steps选项运行测试即可查看它
通常测试签名为:

Signature: LoginCest:login

但请注意,签名还可以包含名称空间:

Signature: MyProject\Tests\LoginCest:login

确保使用正确的测试签名。使用--steps选项运行测试,并从那里复制测试签名。
Codecrement确实根据依赖性对测试进行排序,这是一个很好的特性。

相关问题