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

במאמר הזה מתוארות התבניות וקוד לדוגמה שזמינים כדי לעזור לכם ליצור בדיקות סינתטיות. הפונקציות לדוגמה זמינות במאגר 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 . כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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. כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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. כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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.

כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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.

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

בדוגמה mocha-url-ok מוצג איך פונקציית Cloud Run יכולה להפעיל חבילת מקרים לבדיקה של Mocha, והיא כוללת חבילת מקרים לבדיקה לדוגמה. כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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 הנדרשת.

כדי לראות את הדוגמה המלאה, בסרגל הכלים של הדוגמה, לוחצים על הלוגו של 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));

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