如何使用 C# 对 Azure Blob 存储进行集成测试

How to make integration test for Azure Blob Storage with C#

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

一些应用程序需要 Azure Blob 存储。所有 Azure 云基础设施都可以使用 Manage Identity 访问,业务要求是在无法访问 Azure 门户的情况下测试和验证 Azure Blob 方法,开发人员被限制访问任何存储资源 none 生产或生产。也就是说,业务要求我们通过在本地和 GitHub 工作流上测试代码,甚至在将代码推送到云端之前,让所有存储的东西都能正常工作。

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

无需拥有任何类型的 Blob 存储访问权限即可对 Azure 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();
}

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

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

可以,但需要几个步骤:

  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
  1. 下载并安装 Azure Storage Explorer(可选),这样您就可以看到自己在做什么。
  2. 确保 Azurite 已启动并且 运行 在 docker 桌面上。
  3. 用任何语言编写您自己的 Azure Blob 代码。 (我使用的是 C#,如您在问题代码示例中所见)。
  4. 创建针对 Azurite 的方法测试(下面此答案中的示例)。
  5. 当所有工作都在本地工作时,我们开始使用 Docker.DotNet 在 C# 代码中自动启动 Azurite Docker 以便它可以自动拉取并启动 Azurite 以在本地进行测试,并在 GitHub 操作中持续集成。

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

[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");
}

您可以read更详细的步骤并找到源代码。

享受

Disclaimer: As I mentioned above, I wrote 3 articles about solving this problem. The link of this refers to my personal web site.