如何集成测试Azure Blob存储?

may*_*ʎɐɯ 5 .net c# azure azure-blob-storage

我正在开发一个企业业务项目,需要将应用程序从本地迁移到 Azure 云。

某些应用程序需要 Azure Blob 存储。所有 Azure 云基础设施都可以使用 Manage Identity 进行访问,业务要求是在无法访问 Azure 门户的情况下测试和验证 Azure Blob 方法,开发人员只能访问任何非生产或生产的存储资源。也就是说,该公司要求我们在将代码推送到云之前通过在本地和 GitHub 工作流程上进行测试来使所有存储功能正常工作。

当然,我可以启动我的个人 Azure 帐户并使用它,但仍然会使用我的帐户作为游乐场进行测试,但并不是真正可用的测试。

通用测试 Azure Blob 存储的整个想法,无需对 Blob 存储有任何类型的访问权限。

这可能吗?我怎样才能实现这一目标?

以下是我针对 Azure Blob 的工作 POC 方法:

private readonly BlobContainerClient _blobContainerClient;

public AzureBlobStorage(string connectionString, string container)
{
    _blobContainerClient = new BlobContainerClient(connectionString, container);
    _blobContainerClient.CreateIfNotExists();
}

public async Task<string> ReadTextFile(string filename)
{
    var blob = _blobContainerClient.GetBlobClient(filename);
    if (!await _blobContainerClient.ExistsAsync()) return string.Empty;
    var reading = await blob.DownloadStreamingAsync();
    StreamReader reader = new StreamReader(reading.Value.Content);
    return await reader.ReadToEndAsync();
}

public async Task CreateTextFile(string filename, byte[] data)
{
    var blob = _blobContainerClient.GetBlobClient(filename);
    await using var ms = new MemoryStream(data, false);
    await blob.UploadAsync(ms, CancellationToken.None);
}

public async Task DeleteTextFile(string filename)
{
    var blobClient = _blobContainerClient.GetBlobClient(filename);
    await blobClient.DeleteAsync();
}
Run Code Online (Sandbox Code Playgroud)

may*_*ʎɐɯ 7

经过一番研究,我找到了解决方案并写了一篇关于它的文章。这是解决方案的简短版本。

要针对测试环境进行集成测试,我建议您遵循以下答案:

这是可能的,但需要几个步骤:

  1. 安装并部署Azurite(Azurite是Azure Blob Storage的本地版本,我使用的是docker版本)。
// here we pull azurite image
docker pull mcr.microsoft.com/azure-storage/azurite
// here we run azurite image and store data under c:\azurite folder
docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 -v c:/azurite:/data mcr.microsoft.com/azure-storage/azurite
Run Code Online (Sandbox Code Playgroud)
  1. 下载并安装Azure 存储资源管理器(可选),以便您可以查看正在执行的操作。
  2. 确保 Azurite 已启动并在 Docker 桌面上运行。
  3. 使用任何语言编写自己的 Azure Blob 代码。(我使用了 C#,正如您在问题代码示例中看到的那样)。
  4. 针对 Azurite 创建方法测试(下面的答案中的示例)。
  5. 当所有工作都在本地进行时,我们开始使用 Docker.DotNet 在 C# 代码中自动启动 Azurite Docker,以便它可以自动拉取并启动 Azurite 以进行本地测试以及在 GitHub 操作中进行持续集成。

就我而言,我用我的天蓝色存储方法创建了一个简单的类。你可以做类似的事情(只是例子):

[Fact]
public async Task AzureBlobStorageTest()
{
    // Arrange
    await _azureBlobStorage?.CreateTextFile("file.txt", Encoding.UTF8.GetBytes(Content))!;

    // Act
    var readTextFile = await _azureBlobStorage.ReadTextFile("file.txt");
    
    // Assert
    Assert.Equal(Content, readTextFile);

    // Finalizing
    await _azureBlobStorage.DeleteTextFile("file.txt");
}
Run Code Online (Sandbox Code Playgroud)

您可以更详细地阅读这些步骤并找到源代码。

享受

免责声明:正如我上面提到的,我写了 3 篇关于解决这个问题的文章。此链接指的是我的个人网站