דוגמאות למסכים סינתטיים

במאמר הזה מתוארות התבניות וקוד לדוגמה שזמינים כדי לעזור לכם ליצור בדיקות סינתטיות. הפונקציות לדוגמה זמינות במאגר Google Cloud/synthetics-sdk-nodjs ב-GitHub.

אם אתם כותבים בדיקות ולא מסתמכים על תבנית, אתם צריכים לוודא שהבדיקה עוברת אלא אם מוצג Error. מומלץ להשתמש בספרייה Assert כדי לוודא שכשיש כשלים, הם משויכים לשורת הקוד המתאימה.

תבניות כלליות

התבניות הגנריות מוגדרות לאיסוף נתוני מעקב ויומן עבור בקשות HTTP יוצאות. הפתרון מבוסס על מודול auto-instrumentation-node של OpenTelemetry ועל winston logger. בגלל התלות במוצרים עם קוד פתוח, צפויים שינויים במבנה של נתוני המעקב והיומן. לכן, צריך להשתמש בנתוני העקבות והיומן שנאספו רק למטרות ניפוי באגים.

אתם יכולים להטמיע גישה משלכם לאיסוף נתוני מעקב ויומן עבור בקשות HTTP יוצאות. דוגמה לגישה מותאמת אישית אפשר לראות בכיתה SyntheticAutoInstrumentation.

דוגמה גנרית של Node.js

בדוגמה generic-synthetic-nodejs מוסבר איך לשלוח שאילתה לגבי כתובת URL. הדוגמה הזו מכילה את אותה פונקציה שמוצגת כברירת מחדל במסוף Google Cloud . כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).

const { instantiateAutoInstrumentation, runSyntheticHandler } = require('@google-cloud/synthetics-sdk-api');
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
const functions = require('@google-cloud/functions-framework');
const axios = require('axios');
const assert = require('node:assert');

functions.http('SyntheticFunction', runSyntheticHandler(async ({logger, executionId}) => {
  /*
   * This function executes the synthetic code for testing purposes.
   * If the code runs without errors, the synthetic test is considered successful.
   * If an error is thrown during execution, the synthetic test is considered failed.
   */
  logger.info('Making an http request using synthetics, with execution id: ' + executionId);
  const url = 'https://www.google.com/'; // URL to send the request to
  return await assert.doesNotReject(axios.get(url));
}));

דוגמה ל-TypeScript

בדוגמה generic-synthetic-typescript מוצג איך לשלוח שאילתה לגבי כתובת URL. כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).

import {runSyntheticHandler, instantiateAutoInstrumentation} from '@google-cloud/synthetics-sdk-api'
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
import * as ff from '@google-cloud/functions-framework';
import axios from 'axios';
import assert from 'node:assert';
import {Logger} from 'winston';

ff.http('SyntheticFunction', runSyntheticHandler(async ({logger, executionId}: {logger: Logger, executionId: string|undefined}) => {
  /*
   * This function executes the synthetic code for testing purposes.
   * If the code runs without errors, the synthetic test is considered successful.
   * If an error is thrown during execution, the synthetic test is considered failed.
   */
  logger.info('Making an http request using synthetics, with execution id: ' + executionId);
  const url = 'https://www.google.com/'; // URL to send the request to
  return await assert.doesNotReject(axios.get(url));
}));

תבנית Puppeteer

אם אתם משתמשים ב-Puppeteer, כדאי להתחיל עם הדוגמה generic-puppeteer-nodejs.

הגדרה נדרשת של Puppeteer

כדי להשתמש ב-Puppeteer, צריך לבצע את השלבים הבאים:

  1. כוללים את .puppeteerrc.cjs בספריית קובצי המקור של פונקציית Cloud Run:

    const { join } = require('path');
    
    /**
     * @type {import("puppeteer").Configuration}
     */
    module.exports = {
      cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    };
  2. מוסיפים את הסקריפט הבא לקובץ package.json של פונקציית Cloud Run:

    "scripts": {
         "gcp-build": "node node_modules/puppeteer/install.mjs"
    },
    

דוגמה ל-Puppeteer

בדוגמה generic-puppeteer-nodejs אפשר לראות איך להשתמש ב-Puppeteer עם פונקציית Cloud Run. כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).

const { instantiateAutoInstrumentation, runSyntheticHandler } = require('@google-cloud/synthetics-sdk-api');
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
const functions = require('@google-cloud/functions-framework');
const axios = require('axios');
const assert = require('node:assert');
const puppeteer = require('puppeteer');


functions.http('CustomPuppeteerSynthetic', runSyntheticHandler(async ({logger, executionId}) => {
 /*
  * This function executes the synthetic code for testing purposes.
  * If the code runs without errors, the synthetic test is considered successful.
  * If an error is thrown during execution, the synthetic test is considered failed.
  */

 // Launch a headless Chrome browser and open a new page
 const browser = await puppeteer.launch({ headless: 'new', timeout: 0});
 const page = await browser.newPage();

 // Navigate to the target URL
 const result = await page.goto('https://www.example.com', {waitUntil: 'load'});

 // Confirm successful navigation
 await assert.equal(result.status(), 200);

 // Print the page title to the console
 const title = await page.title();
 logger.info(`My Page title: ${title} ` + executionId);

 // Close the browser
 await browser.close();
}));

תבנית Selenium WebDriver

אם אתם משתמשים ב-Selenium WebDriver, כדאי להתחיל עם הדוגמה generic-selenium-nodejs. הדוגמה, שזמינה ב-GitHub, כוללת קובץ index.js וקובץ package.json.

כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).

const {
  instantiateAutoInstrumentation,
  runSyntheticHandler,
} = require('@google-cloud/synthetics-sdk-api');
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
const functions = require('@google-cloud/functions-framework');
const assert = require('node:assert');

const { Builder, Browser, By } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

/*
 * This function executes the synthetic code for testing purposes.
 * If the code runs without errors, the synthetic test is considered successful.
 * If an error is thrown during execution, the synthetic test is considered failed.
 */
functions.http(
  'CustomSeleniumSynthetic',
  runSyntheticHandler(async ({ logger, executionId }) => {
    /*
     * Construct chrome options
     * Note: `setChromeBinaryPath` must be set to '/srv/bin/chromium' when running in
     *   GCF (but will need to be changed if running on local machine).
     */
    const options = new chrome.Options();
    options.setChromeBinaryPath('/srv/bin/chromium');
    options.addArguments('--headless', '--disable-gpu', '--no-sandbox');

    // Launch headless chrome webdriver with options
    const driver = await new Builder()
      .forBrowser(Browser.CHROME)
      .setChromeOptions(options)
      .build();

    // Navigate to the target URL
    await driver.get('https://example.com');

    // Retrieve title and `a` tag of page
    const title = await driver.getTitle();
    const aTag = await driver.findElement(By.css('a')).getText();

    // assert title is as expected and print to console
    await assert.equal(title, 'Example Domain');
    logger.info(`My URL title is: ${title} ` + executionId);

    await driver.quit();
  })
);

תבנית מוקה

אם אתם כותבים בדיקות שמסתמכות על התבנית Mocha, כדאי לשקול אם רצף של בדיקות צריך להימשך או להיפסק כשמתרחש כשל. כדי להפסיק רצף של בדיקות אחרי כשל, צריך להגדיר את הדגל bail.

במאמר הבלוג Google Cloud Synthetic Monitoring Tutorial מופיעה דוגמה מקיפה שכוללת פריסת API, חבילת בדיקות לדוגמה של Mocha לנקודות הקצה של ה-API והסבר על הגדרת המעקב הסינתטי.

בדוגמה mocha-url-ok מוצג איך פונקציית Cloud Run יכולה להפעיל חבילת בדיקות של Mocha, והיא כוללת חבילת בדיקות לדוגמה. כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).


const functions = require('@google-cloud/functions-framework');
const GcmSynthetics = require('@google-cloud/synthetics-sdk-mocha');

/*
 * This is the server template that is required to run a synthetic monitor in
 * Google Cloud Functions.
 */

functions.http('SyntheticMochaSuite', GcmSynthetics.runMochaHandler({
  spec: `${__dirname}/mocha_tests.spec.js`
}));

/*
 * This is the file may be interacted with to author mocha tests. To interact
 * with other GCP products or services, users should add dependencies to the
 * package.json file, and require those dependencies here A few examples:
 *  - @google-cloud/secret-manager:
 *        https://www.npmjs.com/package/@google-cloud/secret-manager
 *  - @google-cloud/spanner: https://www.npmjs.com/package/@google-cloud/spanner
 *  - Supertest: https://www.npmjs.com/package/supertest
 */

const {expect} = require('chai');
const fetch = require('node-fetch');

it('pings my website', async () => {
  const url = 'https://google.com/'; // URL to send the request to
  const externalRes = await fetch(url);
  expect(externalRes.ok).to.be.true;
});

בדוגמה broken-links-ok אפשר לראות איך מגדירים כלי לבדיקת קישורים שבורים. בתבנית הזו, מציינים רק את הערכים של אובייקט options. באובייקט הזה מצוין ה-URI שצריך לבדוק, והפרמטרים של הבדיקה.

אם אתם משתמשים ב-Puppeteer, הקפידו להשלים את השלבים של הגדרת Puppeteer הנדרשת.

כדי לראות את הדוגמה המלאה, לוחצים על More (עוד) ואז בוחרים באפשרות View on GitHub (צפייה ב-GitHub).


const functions = require('@google-cloud/functions-framework');
const GcmSynthetics = require('@google-cloud/synthetics-sdk-broken-links');

const options = {
  origin_uri: "https://example.com",
  // link_limit: 10,
  // query_selector_all: "a", // https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
  // get_attributes: ['href'], // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
  // link_order: "FIRST_N", // "FIRST_N" or "RANDOM"
  // link_timeout_millis: 30000, // timeout per link
  // max_retries: 0, // number of retries per link if it failed for any reason
  // wait_for_selector: '', // https://pptr.dev/api/puppeteer.page.waitforselector
  // per_link_options: {},
    /*
    // example:
      per_link_options: {
        'http://fake-link1': { expected_status_code: "STATUS_CLASS_4XX" },
        'http://fake-link2': { expected_status_code: 304 },
        'http://fake-link3': { link_timeout_millis: 10000 },
        'http://fake-link4': {
          expected_status_code: "STATUS_CLASS_3XX",
          link_timeout_millis: 10,
        },
      },
    */
  // total_synthetic_timeout_millis: 60000 // Timeout set for the entire Synthetic Monitor
  // screenshot_options: { capture_condition: 'FAILING', storage_location: '' }
};

functions.http('BrokenLinkChecker', GcmSynthetics.runBrokenLinksHandler(options));

המאמרים הבאים