当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

测试夹具(Fixtures)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:52

由  创建, 最后一次修改 2016-02-24 FixturesFixtures 是测试中非常重要的一部分。他们的主要目的是建立一个固定/已知的环境状态以确保 测试可重复并且按照预期方式运行。Yii 提供一个简单可用的 Fixure 框架 允许你精确的定义你的 Fixtures 。Yii 的 Fixture 框架的核心概念称之为?fixture object?。一个 Fixture object 代表 一个测试环境的某个特定方面,它是 yii\test\Fixture 或者其子类的实例。 比如,你可以使用?UserFixture?来确保用户DB表包含固定的数据。 你在运行一个测试之前加载一个或者多个 fixture object,并在结束后卸载他们。一个 Fixture 可能依赖于其他的 Fixtures ,通过它的 yii\test\Fixture::depends 来指定。 当一个 Fixture 被加载前,它依赖的 Fixture 会被自动的加载;同样,当某个 Fixture 被卸载后, 它依赖的 Fixtures 也会被自动的卸载。定义一个 Fixture为了定义一个 Fixture,你需要创建一个新的 class 继承自 yii\test\Fixture 或者 yii\test\ActiveFixture 。前一个类对于一般用途的 Fixture 比较适合, 而后者则有一些增强功能专用于与数据库和 ActiveRecord 一起协作。下面的代码定义一个关于?User?ActiveRecord 和相关的用户表的 Fixture:<?phpnamespace app\tests\fixtures;use yii\test\ActiveFixture;class UserFixture extends ActiveFixture{ public $modelClass = 'app\models\User';}技巧:每个?ActiveFixture?都会准备一个 DB 表用来测试。你可以通过设置 yii\test\ActiveFixture::tableName 或 yii\test\ActiveFixture::modelClass 属性来指定具体的表。如果是后者, 表名会从?modleClass?指定的?ActiveRecord?中获取。注意:yii\test\ActiveFixture 仅限于 SQL 数据库,对于 NoSQL 数据库, Yii 提供以下?ActiveFixture?类:Mongo DB: yii\mongodb\ActiveFixtureElasticsearch: yii\elasticsearch\ActiveFixture (since version 2.0.2)提供给?ActiveFixture?的 fixture data 通常放在一个路径为?FixturePath/data/TableName.php?的文件中, 其中?FixturePath代表 Fixture 类所在的路径,?TableName?则是和 Fixture 关联的表。在以上的例子中, 这个文件应该是@app/tests/fixtures/data/user.php?。 data 文件返回一个包含要被插入用户表中的数据文件,比如:<?phpreturn [ 'user1' => [ 'username' => 'lmayert', 'email' => 'strosin.vernice@jerde.com', 'auth_key' => 'K3nF70it7tzNsHddEiq0BZ0i-OU8S3xV', 'password' => '$2y$13$WSyE5hHsG1rWN2jV8LRHzubilrCLI5Ev/iK0r3jRuwQEs2ldRu.a2', ], 'user2' => [ 'username' => 'napoleon69', 'email' => 'aileen.barton@heaneyschumm.com', 'auth_key' => 'dZlXsVnIDgIzFgX4EduAqkEPuphhOh9q', 'password' => '$2y$13$kkgpvJ8lnjKo8RuoR30ay.RjDf15bMcHIF7Vz1zz/6viYG5xJExU6', ],];你可以给某行指定一个 alias 别名,这样在你以后的测试中,你可以通过别名来确定某行。 在上面的例子中,这两行指定别名为user1?和?user2。同样,你不需要特别的为自动增长(auto-incremental)的列指定数据, Yii 将会在 Fixture 被加载时自动的填充正确的列值到这些行中。技巧:你可以通过设置 yii\test\ActiveFixture::dataFile 属性来自定义 data 文件的位置。 同样,你可以重写 yii\test\ActiveFixture::getData() 来提供数据。如之前所述,一个 Fixture 可以依赖于其他的 Fixture 。比如一个?UserProfileFixture?可能需要依赖于?UserFixture, 因为 user profile 表包括一个指向 user 表的外键。那么, 这个依赖关系可以通过 yii\test\Fixture::depends 属性来指定,比如如下:namespace app\tests\fixtures;use yii\test\ActiveFixture;class UserProfileFixture extends ActiveFixture{ public $modelClass = 'app\models\UserProfile'; public $depends = ['app\tests\fixtures\UserFixture'];}依赖关系确保所有的 Fixtures 能够以正常的顺序被加载和卸载。在以上的例子中, 为确保外键存在,?UserFixture?会在UserProfileFixture?之前加载, 同样,也会在其卸载后同步卸载。在上面,我们展示了如何定义一个 DB 表的 Fixture 。为了定义一个与 DB 无关的 Fixture (比如一个fixture关于文件和路径的),你可以从一个更通用的基类 yii\test\Fixture 继承, 并重写 yii\test\Fixture::load() 和 yii\test\Fixture::unload() 方法。使用 Fixtures如果你使用?CodeCeption?作为你的 Yii 代码测试框架, 你需要考虑使用?yii2-codeception?扩展,这个扩展包含内置的机制来支持加载和访问 Fixtures。 如果你使用其他的测试框架,为了达到加载和访问 Fixture 的目的, 你需要在你的测试用例中使用 yii\test\FixtureTrait。在以下示例中,我们会展示如何通过?yii2-codeception?写一个?UserProfile?单元来测试某个 class。在一个继承自 yii\codeception\DbTestCase 或者 yii\codeception\TestCase 的单元测试类中, 你可以在 yii\test\FixtureTrait::fixtures() 方法中声明你希望使用哪个 Fixture。比如:namespace app\tests\unit\models;use yii\codeception\DbTestCase;use app\tests\fixtures\UserProfileFixture;class UserProfileTest extends DbTestCase{ public function fixtures() { return [ 'profiles' => UserProfileFixture::className(), ]; } // ...test methods...}在测试用例的每个测试方法运行前?fixtures()?方法列表返回的 Fixture 会被自动的加载, 并在结束后自动的卸载。同样,如前面所述,当一个 Fixture 被加载之前, 所有它依赖的 Fixture 也会被自动的加载。在上面的例子中,因为?UserProfileFixture?依赖于UserFixtrue,当运行测试类中的任意测试方法时, 两个 Fixture,UserFixture?和?UserProfileFixture?会被依序加载。当我们通过?fixtures()?方法指定需要加载的 Fixture 时,我们既可以使用一个类名, 也可以使用一个配置数组。配置数组可以让你自定义加载的 fixture 的属性名。你同样可以给一个 Fi

[1] [2] [3]  下一页


测试夹具(Fixtures)