代码之家  ›  专栏  ›  技术社区  ›  Maytham Fahmi

如何使用C对Azure Blob Storage进行单元测试#

  •  1
  • Maytham Fahmi  · 技术社区  · 3 年前

    我正在为企业业务做一个项目,需要将应用程序从内部部署迁移到Azure云。

    某些应用程序需要Azure Blob存储。所有Azure云基础设施都可以使用Manage Identity访问,业务要求是在没有访问Azure门户的情况下测试和验证Azure Blob方法,开发人员对任何存储资源的访问都受到限制,而不是生产或生产。也就是说,该公司要求我们在代码被推送到云之前,通过在本地和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 回复  |  直到 2 年前
        1
  •  3
  •   Maytham Fahmi    2 年前

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

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

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

    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在C#代码中自动启动Azurite Docker。DotNet,因此它可以自动提取并启动Azurite进行本地测试,并在GitHub操作中进行持续集成。

    在我的例子中,我用我的azure存储方法创建了一个简单的类。你可以做一些事情,比如(举个例子):

    [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 更详细的步骤以及查找源代码。

    享受

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