simonvomeyser/laravel-automatic-tests

这是我创建的laravel-automatic-tests包

1.0.5 2023-03-22 14:44 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

一个用于快速自动测试Laravel应用程序中所有静态、内部链接的包。与PHPUnit或PEST一起使用。🎉

有许多选项,但最简单的测试方法是

    //...
    public function testAllStaticPages()
    { 
        // Crawls all pages reachable from the root of your application
        // Makes sure, that all links return a response code < 400
        StaticPagesTester::create()->run();
    }
    //...

安装

composer require simonvomeyser/laravel-automatic-tests

由于所有配置都可以通过流式方法进行,因此不需要发布任何配置。

使用方法

在不进行任何配置的情况下,您可以使用此包...

PEST框架一起使用

<?php
// tests/StaticPagesTest.php
use SimonVomEyser\LaravelAutomaticTests\StaticPagesTester;

it('tests all pages reachable from the frontpage', function () {
    StaticPagesTester::create()->run();
});

PHPUnit一起使用

<?php
// tests/feature/StaticPagesTest.php

namespace Tests\Feature;

use SimonVomEyser\LaravelAutomaticTests\StaticPagesTester;
use Tests\TestCase;

class StaticPagesTest extends TestCase
{
    public function testAllInternalPagesReachableOnFrontpage()
    {
        StaticPagesTester::create()->run();
    }
}

配置

有相当多的方法可以配置默认行为,所有流式方法也可以一起使用。

忽略查询参数和锚链接

由于某些网站使用了大量的查询链接(例如example.com/search?q=lorem)或大量的带有页面锚点的链接(例如example.com/search#section-2),因此可以忽略这些变体并仅检查路径(在这个例子中是example.com/search)一次。

    // ...
    StaticPagesTester::create()
        ->ignorePageAnchors()
        ->ignoreQueryParameters()
        ->run();
    // ...

从不同的页面开始

当然,您可以从不同的页面开始爬取,默认是/,这可能是大多数网站的前页。

    // ...
    StaticPagesTester::create()
        ->startFromUrl('/home')
        ->run();
    // ...

跳过默认断言,检查找到的URI和响应

为了使API尽可能精简,默认断言检查不会从任何给定的URL返回任何4xx5xx错误。

要禁用此行为,您可以通过跳过断言来处理所有URI和响应。

    // ...
    $spt = StaticPagesTester::create()
        ->skipDefaultAssertion()
        ->run();
    
    // access all uris that were found
    // ['/', '/about', ...]
    dump($spt->urisHandled)
    
    // access all uris with their testresponses
    // ['/' => $response, '/about' => $response, ...]
    dump($spt->respones)
    
    // Make own assertions
    $spt->responses['/admin']->assertRedirect();
    
    // ...

添加自定义断言

虽然找到所有URI之后进行所有自定义断言是可能的,但您可以通过addAssertion立即添加自定义断言以跳过模糊处理。

    // ...
    StaticPagesTester::create()
            ->addAssertion(function($response) {
                // Example: allow anything except for 5xx errors for all uris
                assertTrue($response->status() < 500);
            })
            ->skipDefaultAssertion()
            ->addAssertion(function($response, $uri) {
                // Example: check for redirects only when accessing admin area
                if(str_contains($uri, '/admin')) {
                    $response->assertRedirect()
                }
            })
            ->run();
    // ...

定义最大页数和爬取深度

由于自动爬取可能会消耗大量内存,因此您可以定义最大页数/URI或最大爬取深度(1表示仅处理从起始URL开始的URL和找到的页面)。

    // ...
    StaticPagesTester::create()
            ->maxPages(3)
            ->maxCrawlDepth(1)
            ->run();
    // ...

关于传递测试用例的说明

此包需要当前测试用例以启动其爬取 - 实际上,您需要将测试本身传递给new up的StaticPagesTester,如下所示

// This is NOT necessary, but it's happening under the hood
$staticPagesTester = new StaticPagesTester($this);

由于这不是一个漂亮的API,因此该包试图使用create()方法进行一些魔法以找到调用的测试用例。

如果您想在测试之外的其他地方使用StaticPagesTester,请记住这一点。

路线图

我对这个包有很多想法,但我们都有很少的时间,我主要为了自己编写了这个包,只包含了一些基本功能。如果您有兴趣,请让我知道,我们可以讨论一些想法,例如

  • 使此包在Laravel Dusk中高效工作以渲染JavaScript
  • 使此包与文件一起工作:如果您链接到/downloads/something.pdf,我们目前无法检查链接文件的存在
  • 使此包与DataProviders一起工作以获得更好的输出(每个找到的URI一个测试)
  • 添加检查更多内容的途径,例如损坏的外部链接,从而使此包名副其实“LaravelAutomaticTests” 😀

变更日志

请参阅CHANGELOG获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING以获取详细信息。

安全漏洞

请审查我们的安全策略,了解如何报告安全漏洞。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。

测试

要测试此测试包,请运行以下测试命令(#testception)

composer test