

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：使用 Greengrass end-to-end 测试框架和 Greengrass 开发套件运行测试
<a name="run-e2e-tests-tutorial"></a>

AWS IoT Greengrass 测试框架 (GTF) 和 Greengrass 开发套件 (GDK) 为开发人员提供了运行测试的方法。 end-to-end完成本教程后，您可以使用组件初始化 GDK 项目，使用 end-to-end测试模块初始化 GDK 项目，并生成自定义测试用例。生成自定义测试用例后，就可以运行测试了。

在本教程中，您将执行以下操作：

1. 使用组件初始化 GDK 项目。

1. 使用 end-to-end测试模块初始化 GDK 项目。

1. 构建自定义测试用例。

1. 向新测试用例中添加标签。

1. 生成测试 JAR。

1. 运行测试。

**Topics**
+ [先决条件](#run-e2e-tests-tutorial-prerequisites)
+ [步骤 1：使用组件初始化 GDK 项目](#init-gdk-with-component)
+ [步骤 2：使用 end-to-end测试模块初始化 GDK 项目](#init-gdk-with-e2e-test)
+ [步骤 3：构建自定义测试用例](#run-e2e-tests-tutorial-instructions)
+ [步骤 4：向新测试用例中添加标签](#add-tag-to-test-case)
+ [步骤 5：生成测试 JAR](#build-test-jar)
+ [步骤 6：运行测试](#run-test-gtf)
+ [示例：构建自定义测试用例](#build-test-case-example)

## 先决条件
<a name="run-e2e-tests-tutorial-prerequisites"></a>

要完成本教程，您需要：
+ GDK 版本 1.3.0 或更高版本
+ Java
+ Maven
+ Git

## 步骤 1：使用组件初始化 GDK 项目
<a name="init-gdk-with-component"></a>
+ 使用 GDK 项目初始化一个空文件夹。通过运行以下命令下载 Python 中实现的 `HelloWorld` 组件。

  ```
  gdk component init -t HelloWorld -l python -n HelloWorld
  ```

  此命令将在当前目录中创建一个名为 `HelloWorld` 的新目录。

## 步骤 2：使用 end-to-end测试模块初始化 GDK 项目
<a name="init-gdk-with-e2e-test"></a>
+ GDK 允许您下载由功能和步骤实现组成的测试模块模板。运行以下命令打开 `HelloWorld` 目录并使用测试模块初始化现有的 GDK 项目。

  ```
  cd HelloWorld
  gdk test-e2e init
  ```

  此命令将在 `HelloWorld` 目录中创建一个名为 `gg-e2e-tests` 的新目录。这个测试目录是一个 [Maven](https://maven.apache.org/) 项目，它依赖于 Greengrass 测试独立 JAR。

## 步骤 3：构建自定义测试用例
<a name="run-e2e-tests-tutorial-instructions"></a>

编写自定义测试用例大致包括两个步骤：创建包含测试场景的功能文件和实现步骤定义。有关构建自定义测试用例的示例，请参阅 [示例：构建自定义测试用例](#build-test-case-example)。使用以下步骤构建自定义测试用例：

1. 根据测试场景创建功能文件

   功能通常描述正在测试的软件的特定功能。在 Cucumber 中，每个功能都指定为一个单独的功能文件，其中包含标题、详细描述以及一个或多个称为场景的特定案例示例。每个场景都由标题、详细描述以及一系列定义交互和预期结果的步骤组成。场景以结构化格式编写，使用“given”、“when”和“then”关键字。

1. 实现步骤定义

   步骤定义以简明的语言将 [Gherkin 步骤](https://cucumber.io/docs/gherkin/reference/#steps)链接到编程代码。当 Cucumber 在场景中识别 Gherkin 步骤时，它将寻找要运行的匹配步骤定义。

## 步骤 4：向新测试用例中添加标签
<a name="add-tag-to-test-case"></a>
+ 您可以为功能和场景分配标签以组织测试过程。您可以使用标签对场景的子集进行分类，也可以有条件地选择要运行的挂钩。功能和场景可以有多个标签，以空格分隔。

  在本例中，我们使用的是 `HelloWorld` 组件。

  在功能文件中，在 `@Sample` 标签旁边添加一个名为 `@HelloWorld` 的新标签。

  ```
  @Sample @HelloWorld
  Scenario: As a developer, I can create a component and deploy it on my device
  ....
  ```

## 步骤 5：生成测试 JAR
<a name="build-test-jar"></a>

1. 生成组件。在生成测试模块之前，必须先生成组件。

   ```
   gdk component build
   ```

1. 使用以下命令生成该测试模块。此命令将在 `greengrass-build` 文件夹中生成测试 JAR。

   ```
   gdk test-e2e build
   ```

## 步骤 6：运行测试
<a name="run-test-gtf"></a>

运行自定义测试用例时，GTF 会自动执行测试的生命周期，并管理测试期间创建的资源。它首先将待测设备 (DUT) 配置为一个 AWS IoT 东西，然后在其上安装 Greengrass 核心软件。然后使用该路径中指定的配方创建一个名为 `HelloWorld` 的新组件。然后通过 Greengrass 事物部署将该 `HelloWorld` 组件部署至核心设备上。然后验证部署是否成功。如果部署成功，部署状态将在 3 分钟内更改为 `COMPLETED`。

1. 转至项目目录中的 `gdk-config.json` 文件，使用 `HelloWorld` 标签来定位测试。使用以下命令更新 `test-e2e` 密钥：

   ```
     "test-e2e":{
       "gtf_options" : { 
            "tags":"HelloWorld"
        }
     }
   ```

1. 在运行测试之前，必须向主机设备提供 AWS 凭据。GTF 使用这些证书在测试过程中管理 AWS 资源。确保您提供的角色有权自动执行测试中包含的必要操作。

   运行以下命令以提供 AWS 凭据。

   1. 

------
#### [ Linux or Unix ]

     ```
     export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
     export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
     ```

------
#### [ Windows Command Prompt (CMD) ]

     ```
     set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
     set AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
     ```

------
#### [ PowerShell ]

     ```
     $env:AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
     $env:AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
     ```

------

1. 使用以下命令运行测试。

   ```
   gdk test-e2e run
   ```

   该命令下载 `greengrass-build` 文件夹中最新版本的 Greengrass Nucleus，并使用它运行测试。该命令也仅针对带有 `HelloWorld` 标签的场景，并为这些场景生成报告。您将看到在此测试期间创建的 AWS 资源在测试结束时被丢弃。

## 示例：构建自定义测试用例
<a name="build-test-case-example"></a>

**Example**  
GDK 项目中下载的测试模块由示例功能和步骤实现文件组成。  
在以下示例中，我们创建一个功能文件来测试 Greengrass 软件的事物部署功能。我们使用一个通过 Greengrass AWS 云执行组件部署的场景对该功能进行了部分测试。这一系列步骤有助于我们了解每个测试用例的交互作用和预期结果。  <a name="build-test-case-example-steps"></a>

1. 

**创建功能文件**

   导航至当前目录中的 `gg-e2e-tests/src/main/resources/greengrass/features` 文件夹。您可以找到类似于以下示例的示例 `component.feature`。

   在此功能文件中，您可以测试 Greengrass 软件的事物部署功能。您可以使用一个通过 Greengrass 云执行组件部署的场景对该功能进行部分测试。该场景包含一系列步骤，有助于了解此用例的交互作用和预期结果。

   ```
   Feature: Testing features of Greengrassv2 component
   
   Background:
       Given my device is registered as a Thing
       And my device is running Greengrass
   
   @Sample
   Scenario: As a developer, I can create a component and deploy it on my device
       When I create a Greengrass deployment with components
           HelloWorld | /path/to/recipe/file
       And I deploy the Greengrass deployment configuration
       Then the Greengrass deployment is COMPLETED on the device after 180 seconds
       And I call my custom step
   ```

   GTF 包含以下所有步骤的步骤定义，但名为 `And I call my custom step` 的步骤除外。

1. 

**实现步骤定义**

   GTF 独立 JAR 包含所有步骤的步骤定义，但一个步骤除外：`And I call my custom step`。您可以在测试模块中实现此步骤。

   导航到测试文件的源代码。您可以使用以下命令通过步骤定义链接您的自定义步骤。

   ```
   @And("I call my custom step")
   public void customStep() {
       System.out.println("My custom step was called ");
   }
   ```