在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)


相关文章
|
14天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
116 64
|
4天前
|
测试技术 Android开发 UED
探索软件测试中的自动化框架选择
【10月更文挑战第29天】 在软件开发的复杂过程中,测试环节扮演着至关重要的角色。本文将深入探讨自动化测试框架的选择,分析不同框架的特点和适用场景,旨在为软件开发团队提供决策支持。通过对比主流自动化测试工具的优势与局限,我们将揭示如何根据项目需求和团队技能来选择最合适的自动化测试解决方案。此外,文章还将讨论自动化测试实施过程中的关键考虑因素,包括成本效益分析、维护难度和扩展性等,确保读者能够全面理解自动化测试框架选择的重要性。
19 1
|
10天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
13天前
|
Web App开发 敏捷开发 存储
自动化测试框架的设计与实现
【10月更文挑战第20天】在软件开发的快节奏时代,自动化测试成为确保产品质量和提升开发效率的关键工具。本文将介绍如何设计并实现一个高效的自动化测试框架,涵盖从需求分析到框架搭建、脚本编写直至维护优化的全过程。通过实例演示,我们将探索如何利用该框架简化测试流程,提高测试覆盖率和准确性。无论你是测试新手还是资深开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
13天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
20 5
|
1月前
|
测试技术 开发者
vertx的学习总结6之动态代理类和测试
本文是Vert.x学习系列的第六部分,介绍了如何使用动态代理在事件总线上公开服务,以及如何进行Vert.x组件的异步测试,包括动态代理的创建和使用,以及JUnit 5和Vert.x测试工具的结合使用。
18 3
vertx的学习总结6之动态代理类和测试
|
2天前
|
机器学习/深度学习 自然语言处理 物联网
探索自动化测试框架的演变与未来趋势
随着软件开发行业的蓬勃发展,软件测试作为保障软件质量的重要环节,其方法和工具也在不断进化。本文将深入探讨自动化测试框架从诞生至今的发展历程,分析当前主流框架的特点和应用场景,并预测未来的发展趋势,为软件开发团队选择合适的自动化测试解决方案提供参考。
|
1月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
5天前
|
测试技术 持续交付
探索软件测试中的自动化框架:优势与挑战
【10月更文挑战第28天】 随着软件开发的快速进步,自动化测试已成为确保软件质量的关键步骤。本文将探讨自动化测试框架的优势和面临的挑战,以及如何有效地克服这些挑战。
15 0
|
25天前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
69 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)