juampi92/test-seo 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

juampi92/test-seo

最新稳定版本:v1.8

Composer 安装命令:

composer require --dev juampi92/test-seo

包简介

Easy way to test your SEO

README 文档

README

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

An easy-to-use package for testing SEO. The package allows you to extract SEO tags from a given HTML and verify that the SEO structure is correct.

Installation

You can install the package via composer:

composer require juampi92/test-seo --dev

Usage

// Create TestSEO instance using the response:
$seo = new TestSEO($htmlResponse);

// Perform assertions:
$seo->assertTitleEndsWith(' - My Website');

// Assert the data yourself:
$this->assertEquals(
    'My title - My Website',
    $seo->data->title()
);

Look at the following examples using PHPUnit, Laravel, and Pest.

PHPUnit

public function testLandingPageSEO()
{
    // Arrange
    // ...
    
    // Act
    $response = $client->get('/')->send();

    // Assert
    $this->assertEquals(200, $response->getStatusCode());
    $html = json_decode($response->getBody(true), true);

    $seo = new TestSEO($html);
    
    // Assert
    $seo
        ->assertTitleEndsWith(' - My Website')
        ->assertCanonicalIs('https://www.mywebsite.com/');
}

Laravel

public function test_landing_page_SEO()
{
    // Arrange
    // ...
    
    // Act
    $response = $this->get('/');

    // Assert
    $response->assertStatus(200);

    $seo = new TestSEO($response->getContent());
    
    $seo
        ->assertTitleEndsWith(' - My Website')
        ->assertCanonicalIs('https://www.mywebsite.com/');
}

Pest

test('landing page SEO tags', function () {
    // Arrange
    // ...
    
    // Act
    $response = get('/')->assertStatus(200);
    
    $seo = new TestSEO($response->getContent());
    
    // Assert
    expect($seo->data)
        ->title()->toEndWith(' - My Website')
        ->description()->toBe('This is my description')
        ->canonical()->not()->toBeNull()
        ->robots()->index()->toBeTrue()
        ->robots()->nofollow()->toBeTrue();
});

SEO Data

You can access the SEO Data yourself by accessing the public property TestSEO->data. Here are the available methods:

Method Returns Description
title() ?string <title>{this}</title>
description() ?string <meta name="description" content="{this}">
image() ?Url 🔍 <meta name="image" content="{this}">
robots() Robots 🔍 <meta name="robots" content="{this}">
canonical() ?Url 🔍 <link rel="canonical" href="{this}">
prev() ?Url 🔍 <link rel="prev" href="{this}">
next() ?Url 🔍 <link rel="next" href="{this}">
openGraph() TagCollection 🔍 <meta property="og:{key}" content="{value}">
twitter() TagCollection 🔍 <meta name="twitter:{key}" content="{value}">
alternateHrefLang() AlternateHrefLangCollection 🔍 <link name="alternate" hreflang="{hreflang}" href={href}>
images() array<array{src: string, alt: string, title: string}> All images in the page. <img src="...">
h1s() array<string> All H1 in the page. <h1>{this}</h1>
h2s() array<string> All H2 in the page. <h2>{this}</h2>
charset() ?string <meta charset="utf-8">

The SEOData class is Macroable, so feel free to extend it yourself.

Assertions

Method Notes
assertCanonicalIs(string $expected)
assertCanonicalIsEmpty()
assertRobotsIsEmpty()
assertRobotsIsNoIndexNoFollow() Checks that the robots are noindex, nofollo or none
assertPaginationIsEmpty() prev and next are both missing.
assertAlternateHrefLangIsEmpty()
assertTitleIs(string $expected)
assertTitleContains(string $expected)
assertTitleEndsWith(string $expected)
assertDescriptionIs(string $expected)
assertThereIsOnlyOneH1() Make sure there is only one H1 in the entire website.
assertAllImagesHaveAltText() Make sure all images have an alt="..."
Suggest your own! These assertions can help devs to follow the best SEO practices. Make a PR if you think some are missing!

Snapshots

When it comes to SEO, a snapshot test is a great way to ensure nothing has been changed by accident.

Here is an example:

$seo = new TestSEO($response->getContent(), snapshotSerializer: null);

$json = json_encode($seo);

By default, the SEO tags are serialized using the SimpleSerializer. Make your own serializer by implementing the SnapshotSerializer interface:

$seo = new TestSEO($response->getContent(), new MyCustomSerializer());

$json = json_encode($seo);

Pest Example

use function Spatie\Snapshots\{assertMatchesSnapshot, assertMatchesJsonSnapshot};
use Juampi92\TestSEO\TestSEO;

test('landing page SEO', function () {
    $response = $this->get('/');

    $response->assertStatus(200);

    $seo = new TestSEO($response->getContent());

    assertMatchesJsonSnapshot(json_encode($seo));
});

Note: this example requires spatie/pest-plugin-snapshots.

Contributing

Please see CONTRIBUTING for details.

Credits

License

The MIT License (MIT). Please see License File for more information.

统计信息

  • 总下载量: 334.52k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 26
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 26
  • Watchers: 1
  • Forks: 5
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-08-28