测试

=====================================================================

1 一次测试通过 则第二次重复的测试就会通过,如果环境正常的话
2  测试就一定要改变因素 换个时间 换个邮箱  换个地点 换个用户名 换个角色
3  最好是搞懂来龙去脉。

=====================================================================

测试风格的代码

1, 注释一看都明白

2, 单个功能便于测试; 写出来的代码一定要便于测试单独的测试

=====================================================================

还有就是多测试, 多想想到底做对了吗, 是不是有啥问题。一旦有问题, 就真的有问题, 可能是比较严重的问题,

不能觉得没有问题就侥幸的觉得可能没有问题,而放松。

================================================================
可以这么理解, 测试是代码的4倍, 大部分的时间都是在测试, 
测试主要包含这两个地方

================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================

User Accept Environment 用户仿真测试环境

 

记住一个教训:环境一定要刷完整,否则,浪费大量的时间,不值得
这次花了不少时间,问题出在password上面
 
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
================================================================
做项目有以下难点:
1, 搞清楚需求
2, 测试的场景, 要覆盖全面(分为需求场景, 参数变换场景, 暴力测试, )
3, 要自己测试,别人是测不出来的, 因为责任不在别人身上,
4,

=====================================================================

一般在测试服务器
除非只需要修改一个不大于二个参数
否则谁也不知道也许什么地方会出什么问题
非常不好修复

=====================================================================

 

为了方便测试和更改数据, 应该从单一入口的代码开始出发, 从开始就设计成单一入口, 这样既可以通过循环来批量处理多个数据, 或者一次调用一个处理一个数据, 这样就具有可伸缩可扩展. 为了方便在本地人为的准备一些处理的数据, 我们可以在函数里多加另外的参数, 并让参数有默认值NULL, 如果传值进去那么就用传进去的值,如果没有传值就用系统去获取相应的值。

 

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

==================================================================

测试, 

1, 环境刷新, 每次大的测试都要用最新的代码和数据, 不能用已有的数据, 可能会误导或者干扰测试。干扰测试的功能的通过。

==================================================================

在drupal8之后添加phpunit, 感觉是很重要的。

file->settings->test-framework->vendor/autoload.php

file->settings->test-framework->copy of core/tests/phpunit.xml.dist 修改一些参数配置

到 custom/module_name/src/Tests/xxxTest.php 然后运行里面的方法, phpstorm编辑器左侧栏在XXXTst方法旁边有个三角按钮可以点击

 

==================================================================

大致的步骤:   1,    2,    3, 4,....从范围大写到范围小,
命令行后台改数据, 要想好怎么写日志, 要在不实际运行代码更改数据的情况下, 完整看到将要修改的数据, 看是否和前后的情况匹配的上。
如果测试怎么实现, 分哪几种情况,以减少错误的数据.
--
如果是可以从网页访问的话, 也是先要有大致的步骤, 和想好测试的几种场景
--
需求比较负责的情况下, 就考虑用表格的方式, 可能比较复杂,总是表述清楚了, 不然用语音来表达, 感觉真的很复杂。

 

----
变量名: 名字_类别
尽力不要超过3个单词组成变量名.
除非是非常简单的变量名, 可以简单点的单字母,
--
承认自己的平庸, 承认自己的无能。
--
所谓的代码清晰就是:
在某个地方是提纲地方, 就好比一本书, 要写提纲也要写好目录, 比较方便查找。
-----
在线cron表达式:
https://crontab.guru/

------------------

expects() - Sets how many times you expect a method to be called:
If you know, that method is called once use $this->once() in expects(), otherwise use $this->any()

if method expected to be called once will be called more times, test will probably fail
 

-----------------

 https://www.cnblogs.com/cccty/p/5926413.html

class StubTest extends TestCase
{
    // 继承了 testCase 就能建立桩件了, 桩件的意思就是针对某个类的模拟类, 然后给桩件
// 这里的桩件是翻译过来的, 其实就是占位符, 但站的是一个类的位,
// 然后是配置站位类, 全是虚拟的, 还能给他配置方法, 并指定返回值, 这也就太神奇了吧.

public function testStub() { // 为database类建立桩件。 $stub = $this->getMockBuilder("database")//类名 ->setMethods(array('find')) //可以是多个方法 ->getMock(); // 配置桩件。 $stub->method('find')//想要设置返回值的方法 ->willReturn(0);//设置返回值      $ser=new Switch();
     $ser->server=$stub; //将桩件赋值给server
     $ser->switchClother("1"); //调用被测试的方法
       // 现在调用将返回 '裙子'。

     $this->assertEquals('裙子', $stub->find()); } }

?>
我觉得测试似乎应该是认为的造数据, 然后获取或者什么的, 尽量的模拟正式条件下的数据和情况, 才能方便以后重构, 不然都stub了, 那准确性何在哦?

-----------------------------------------------------------------

 在PHPSTORM里 testXXX 方法旁边有个三角运行的符号, 点击就能激发运行phpunit, 但有时会提示错误说 PHP解释器 没有, 这时就要配置一下解释器, 就好了
或者把鼠标放到方法体里, 然后快捷键 ctrl + shift + f10 就可以了

-----------------------------------------------------------------
在PHPstorm 里可以建立新建一个php test文件类型, 搜索test就能找到

----------------------------------------------------------------

 composer remove phpunit/phpunit

composer require phpunit/phpunit:^7 # In my case, this installed phpunit 7.5.20
composer require symfony/phpunit-bridge:^3.4.3
composer require behat/behat:^3.4
composer require behat/mink:^1.8
composer require behat/mink-goutte-driver:^1.2

https://drupalsun.com/2020/04/10/functional-testing-browser-drupal-8-9-using-phpunit

phpunit/php-invoker (^2.0) composer require phpunit/php-invoker: ^2.0

现在推荐的版本是6.5, 不是7
------------------------------------------

把本地 Apache 的用户改成当前用户, 把当前文件夹的 所有者 所属组 全部改成 当前用户
不知道是不是需要这样改, 但这样改之后, 可以运行通顺了, 好几天都在弄这个, 真的好感谢。

-------------------------------------
Unit tests test functions, methods, and classes without requiring a database connection to run.
On the other hand, kernel tests test the integration of module APIs and require a database connection
to be configured to run. Functional tests test the entire system and require more setup than the others.
Within the functional tests, there are both Browser and JavaScript tests.

unit test: 函数, 类的功能的测试, 功能本身的验证
kernel test: 涉及到数据库, 数据交互
function test: 模拟用户登录, 需要 set up, 需要调用浏览器

-----------------------------------------

sudo ln -s ./vendor/bin/phpunit
不需要指定具体的文件名, 自动生成本地当前目录的软连接文件, 名字自动生成的

-----------------------------------------

unit test
 abstract class UnitTestCase extends TestCase
 abstract class LocalTaskIntegrationTestBase extends UnitTestCase
 class ActionLocalTasksTest extends LocalTaskIntegrationTestBase
 
function test:
 class ActionListTest extends BrowserTestBase

不同的功能连接不同的 类

-------------------------------------------------------------

 prophecy
预言; 预言能力;

$prophecy = $this->prophesize(KeyValueFactoryInterface::CLASS);

https://www.drupal.org/docs/testing/phpunit-in-drupal/using-prophecy
--------------------------------------------

global functions do not exist in the testing environment.

====================================================

单元测试过程中经常会遇到被测试 函数/类 A依赖另一个 函数/类 B,但是B已经完全测试过,
没有必要在测试A的时候重复测试B。如何去除这种不必要的测试呢?

为什么需要mock对象呢?有时候,很难测试被测系统(System Under Test,“被测系统”以下简称SUT),因为SUT依赖一些不能在测试环境使用的组件。这些组件有可能不可用(如第三方系统),或者他们不能返回测试中期望的结果,或者是这些组件执行后会带来负面效果(如修改数据库中的数据)。这时候,就需要mock对象来解决这些问题。Mock对象提供相同的API,供SUT调用,使得SUT可以正常运转。如果希望在测试中大范围的使用mock对象,对程序开发而言也有要求,程序开发过程中必须依照高内聚,底耦合的策略,并且尽量使用接口编程,这样mock类才可以去模仿——通过继承和多态,否则mock对象没有用武之地。这一点,也暴露出了mock类的短板,mock只能模拟类中的public,protected函数,如果是static, private或final函数,mock对象无能为力。

$oMockOrderDao = $this->getMock('OrderDao');
上面这段代码就为我们完成了手动创建OrderDaoMock类的工作。
$oMockOrderDao->expects($this->any())->method('insert')
  ->with($aOrder)->will($this->returnValue(0));
这段代码代码为我们完成了四个针对mock对象调用的断言:
1)调用insert方法(method);
2)调用任意次(expect);
3)调用时,输入参数必须是$aOrder对象(with);
4)调用结束后,返回参数必须是0(返回值).

https://www.cnblogs.com/bourneli/archive/2012/06/29/2570440.html]

 https://www.cnblogs.com/bourneli/archive/2012/06/29/2570440.html

==============================================================

 

<phpunit bootstrap="src/autoload.php">
    <testsuites>
        <testsuite name="money">
            <file>tests/HelloTest.php</file>
            <file>tests/MoneyTest.php</file>
            <file>tests/SiteTest.php</file>
        </testsuite>
    </testsuites>
</phpunit>
----
这个地方可以考虑 testsuit就是模块名 file就是绝对类路径下的测试文件, 可以方便测试运行

 <phpunit bootstrap="src/autoload.php">

  <testsuites>

    <testsuite name="money">

     <directory>tests</directory>

   </testsuite>

</testsuites>

</phpunit>

-------
这个更狠了, 直接用directory
--
测试不应该在测试环境么

 

还有PHPunit的中文网站, 资料很全

http://www.phpunit.cn/manual/current/zh_cn/phpunit-book.pdf

 

composer require --dev phpunit/phpunit
好不容易安装了一个8.5.8, 但是却不能运行成功,不是这个类没有找到, 还是那个包出现冲突。
----------

最后找了一个phar也是看到网上的 (https://www.tiance.club/post/2488698508.html)
最后运行成功
可以用本地写的一个很简单的phpunit.xml, 没有什么包依赖,
运行可以的, 但如果用了drupal8提供的那个phpunit.xml就不能运行了。

--------------------------------------

drupal本身带的phpunit.xml和repository也不行, 太坑了哦。
重新下载了一个phpunit-8.5.8.phar, 也不能运行, 这个就说明在目前的drupal8下面, 和8.5.8这个版本是不兼容的。
那就只能用6.5.3这个版本了。

---------------------------------------

筛选文件建中某一类文件的,
phpunit --filter 'Zhou' /home/dev/zzz

 

筛选文件建中某一个文件的
phpunit --filter 'ZhouErTest' /home/dev/zzz

筛选文件建中某一个具体测试用例的
phpunit --filter 'testAdd' /home/dev/zzz

筛选某个具体的类中,某个具体的用例

phpunit --filter 'ZhouErTest::testAdd' /home/dev/zzz


--------------------------------------------

 

phpunit也有browserTest
---

For newer versions of phpunit, it is just:

phpunit --filter methodName path/to/file.php

一次运行一个命令,
0--以前的版本: 
phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php
phpunit --filter methodName ClassName path/to/file.php


========================================================

  当你不想测试的时候, 肯定会出问题呀

 

这里面的肯定就有问题了

============

 

 

=====================================================================

=====================================================================

=====================================================================

=====================================================================

=====================================================================

=====================================================================

=====================================================================

=====================================================================

测试和写代码是两回事,
写代码的时候也会有测试,
那个时候是为了做出来,顺带满足功能
很可能有些没有考虑到的
因为智者千虑必有一失嘛

=====================================================================

=====================================================================

=====================================================================

=====================================================================


现在的问题是,写完了如何测试呢:
1 重新出发,开始测试,测试是一个工序
2 测试的时候不要想着写代码的时候时候有什么情况有什么判断,那样的话,只能测试代码的功能是否实现了,不代表在具体的环境中是正常运行的。
3 从最简单的功能开始实现,随机的用一些特殊情况来弄弄,把自己想象成一个小白用户,多几种测试的情况,
4 最好一个地方想象出4-5中不同的场景?

=====================================================================

=====================================================================

Test Plan:用来描述一个性能测试,包含与本次性能测试所有相关的功能。相当于一个solution

Tread Group:相当于一个Test case。分为1) setup thread group  2)teardown thread group 3)thread group

Test Fragment:测试片段,【右键 Test Plan - Add - Test Fragment - Test Fragment】,相当于一个公共的类

Module Controller:右键 Thread Group - Add - Logic Controller - Module Controller】,在Module To Run下面选择需要的Test Fragment 即可,以此来对Test Fragment进行调用。

Http Request:相当于一次对API的调用

----

posted @ 2018-02-28 10:46  qqisnow2021  阅读(443)  评论(0编辑  收藏  举报