在Yii2框架下使用自带codeception进行单元测试提示model类不存在解决方法

简介: 在Yii2框架下使用自带codeception进行单元测试提示model类不存在解决方法

开发环境以及版本

PHP 7.3.12

PHP 7.3.12 (cli) (built: Nov 21 2019 19:00:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.12, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.12, Copyright (c) 1999-2018, by Zend Technologies

Yii 2.0.30

Codeception 2.3.9

问题描述

使用框架自带的Codeception进行单元测试编写,引入自定义命名空间的model,提示找不到类

lxy@bogon ddddemo % php vendor/bin/codecept run unit ExampleTest                                     
Codeception PHP Testing Framework v2.3.9
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.
App\tests.unit Tests (1) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Fatal error: Uncaught Error: Class 'app\application\domains\user\UserInfo' not found in /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php:25
Stack trace:
#0 /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php(57): app\tests\unit\ExampleTest->testSomeFeature()
#1 /Users/lxy/code/ddddemo/vendor/phpunit/phpunit/src/Framework/TestSuite.php(755): app\tests\unit\ExampleTest->run(Object(PHPUnit\Framework\TestResult))
#2 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/PHPUnit/Runner.php(106): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#3 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/SuiteManager.php(157): Codeception\PHPUnit\Runner->doEnhancedRun(Object(Codeception\Suite), Object(PHPUnit\Framework\TestResult), Array)
#4 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/Codecept.php(189): Codeception\SuiteManager->run(Object(Codeception\PHPUnit\Runner), Object(PHPUnit\Framework\TestResult), Array)
#5 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Code in /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php on line 25
FATAL ERROR. TESTS NOT FINISHED.
Uncaught Error: Class 'app\application\domains\user\UserInfo' not found in /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php:25
Stack trace:
#0 /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php(57): app\tests\unit\ExampleTest->testSomeFeature()
#1 /Users/lxy/code/ddddemo/vendor/phpunit/phpunit/src/Framework/TestSuite.php(755): app\tests\unit\ExampleTest->run(Object(PHPUnit\Framework\TestResult))
#2 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/PHPUnit/Runner.php(106): PHPUnit\Framework\TestSuite->run(Object(PHPUnit\Framework\TestResult))
#3 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/SuiteManager.php(157): Codeception\PHPUnit\Runner->doEnhancedRun(Object(Codeception\Suite), Object(PHPUnit\Framework\TestResult), Array)
#4 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Codeception/Codecept.php(189): Codeception\SuiteManager->run(Object(Codeception\PHPUnit\Runner), Object(PHPUnit\Framework\TestResult), Array)
#5 /Users/lxy/code/ddddemo/vendor/codeception/base/src/Code 
in /Users/lxy/code/ddddemo/tests/unit/ExampleTest.php:25
lxy@bogon ddddemo % php vendor/bin/codecept run unit ExampleTest
Codeception PHP Testing Framework v2.3.9
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.
Fatal error: Trait '_generated\UnitTesterActions' not found in /Users/lxy/code/ddddemo/tests/_support/UnitTester.php on line 21

codeception 相关的配置文件没有修改过

分析过程

1 检查配置文件

对于单元测试涉及到的文件有这两个

  • codeception.yml
  • unit.suite.yml

codeception.yml

actor: Tester
paths:
    tests: tests 
    log: tests/_output
    data: tests/_data
    helpers: tests/_support //重点看支持类生成目录
settings:
    bootstrap: _bootstrap.php
    memory_limit: 1024M
    colors: true
modules:
    config:
        Yii2:
            configFile: 'config/test.php'

unit.suite.yml

# Codeception Test Suite Configuration
# suite for unit (internal) tests.
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: UnitTester
modules:
    enabled:
#      - app\application\domains\user\UserInfo
      - Asserts
      - Yii2:
            part: [orm, email, fixtures]

2 定位 tests/_support

tests/_support 默认有3个文件

我们打开对应单元测试的

<?php
/**
 * Inherited Methods
 * @method void wantToTest($text)
 * @method void wantTo($text)
 * @method void execute($callable)
 * @method void expectTo($prediction)
 * @method void expect($prediction)
 * @method void amGoingTo($argumentation)
 * @method void am($role)
 * @method void lookForwardTo($achieveValue)
 * @method void comment($description)
 * @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
 *
 * @SuppressWarnings(PHPMD)
*/
class UnitTester extends \Codeception\Actor
{
    use _generated\UnitTesterActions;
   /**
    * Define custom actions here
    */
}

发现了问题,文件没有命名空间

在执行测试之后,项目会生成_generated文件夹,这里面的文件是自动生成的,经过查看也是没有命名空间,这直接导致找不到对应的文件。

解决方案

1 删除 tests/_support 内的所有文件

_support 内的文件会自动生成,删除不会造成影响。

2 修改配置文件 codeception.yml

配置文件增加 namespace ,添加之后会给 tests/_support 内的文件增加命名空间。

修改后的文件如下

namespace: app\tests\_support
actor: Tester
paths:
    tests: tests
    log: tests/_output
    data: tests/_data
    helpers: tests/_support
settings:
    bootstrap: _bootstrap.php
    memory_limit: 1024M
    colors: true
modules:
    config:
        Yii2:
            configFile: 'config/test.php'

3 执行 build重新生成文件

lxy@bogon ddddemo % php vendor/bin/codecept build
Building Actor classes for suites: functional, unit
 -> FunctionalTesterActions.php generated successfully. 0 methods added
app\tests\_support\FunctionalTester includes modules: Filesystem, Yii2
FunctionalTester.php created.
 -> UnitTesterActions.php generated successfully. 0 methods added
app\tests\_support\UnitTester includes modules: Asserts, Yii2
UnitTester.php created.

4 执行 run unit

lxy@bogon ddddemo % php vendor/bin/codecept run unit
Codeception PHP Testing Framework v2.3.9
Powered by PHPUnit 6.5.14 by Sebastian Bergmann and contributors.
App\tests\_support.unit Tests (1) -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
✔ ExampleTest: Some feature (0.03s)
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3x DEPRECATION: Calling the "Symfony\Component\EventDispatcher\EventDispatcherInterface::dispatch()" method with the event name as the first argument is deprecated since Symfony 4.3, pass it as the second argument and provide the event object as the first argument instead. /Users/lxy/code/ddddemo/vendor/symfony/event-dispatcher/EventDispatcher.php:58
Time: 212 ms, Memory: 12.00MB
OK (1 test, 1 assertion)


相关文章
|
1天前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
12 5
|
1天前
|
敏捷开发 测试技术 持续交付
探索自动化测试框架的演进与实践
【7月更文挑战第14天】自动化测试框架在软件开发生命周期中扮演着越来越重要的角色。本文旨在探讨自动化测试框架从简单的脚本到复杂的系统级解决方案的演变过程,并分析其在不同阶段解决的关键问题。通过案例研究,我们将深入了解如何选择合适的自动化测试工具以及设计有效的测试策略,以提升软件质量保障的效率和效果。
|
4天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
23 6
|
2天前
|
敏捷开发 存储 数据管理
自动化测试框架设计:从理论到实践
【7月更文挑战第13天】本文将深入探讨自动化测试框架的设计原理与实现方法。通过分析自动化测试的必要性和框架设计的基本原则,结合具体案例,展示如何从零开始构建一个高效、可维护的自动化测试系统。文章不仅涵盖框架的结构设计,还包括最佳实践和常见问题的解决策略,为读者提供一套完整的解决方案和实操指南。
|
2天前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
11 2
|
6天前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十一)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-下篇(详解教程)
【7月更文挑战第9天】在Java项目中,使用Logback配置可以实现日志按照不同包名输出到不同的文件,并且根据日志级别分开记录。
20 4
|
4天前
|
敏捷开发 Devops 测试技术
自动化测试框架的演进与实践
【7月更文挑战第11天】在软件开发的历程中,自动化测试始终扮演着不可或缺的角色。本文将通过探讨自动化测试框架的发展脉络,揭示其在现代软件工程中的应用与挑战。从早期的线性脚本到今日的模块化框架,我们将一窥自动化测试技术的演进之路,并分享实践中的经验和策略,旨在为读者提供一套实用的自动化测试解决方案。
5 1
|
5天前
|
jenkins 测试技术 持续交付
探索自动化测试框架在软件开发中的应用
【7月更文挑战第10天】随着软件行业的快速发展,高效、可靠的软件产品成为企业竞争的核心。自动化测试框架作为提升软件质量与开发效率的关键技术,其在软件开发过程中扮演着越来越重要的角色。本文将深入探讨自动化测试框架的应用,从其定义、优势到具体实施策略,旨在为软件开发团队提供一套完整的自动化测试解决方案。通过实际案例分析,我们将展示如何有效整合自动化测试框架到软件开发生命周期中,以及如何克服实施过程中可能遇到的挑战。
|
9天前
|
监控 Java 测试技术
如何构建高效的自动化测试框架:策略与实践
【7月更文挑战第6天】构建高效的自动化测试框架是一个持续的过程,需要不断迭代和优化。通过遵循设计原则、选择合适的关键技术、并遵循科学的实施步骤,我们可以构建出稳定、可靠、易于维护的自动化测试框架,为软件质量的提升和交付周期的缩短提供有力支持。
|
7天前
|
XML Java 测试技术
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)
【7月更文挑战第8天】这篇教程介绍了如何使用Logback将Java应用的日志输出到文件中。首先,通过创建`logback.xml`配置文件,设置`FileAppender`来指定日志文件路径和格式。然后,提供了一个`RollingFileAppender`的例子,用于每日生成新的日志文件并保留一定天数的历史记录。文中包含配置文件的XML代码示例,并展示了控制台输出和生成的日志文件内容。教程最后提到了一些可能遇到的问题及解决建议。
15 0
《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)