在.NET

时间:2018-02-12 06:34:14

标签: amazon-web-services zip zipfile aws-device-farm

我正在使用AWS Appium for Python。由于我们的项目要求,测试将使用Python,但我们需要使用.NET以编程方式在AWS中构建,上载和安排测试。

遵循AWS文档,测试包zip文件的根目录中应包含以下项目:" tests"文件夹,"驾驶室"文件夹和" requirements.txt"文件。

当我在Windows机器上手动构建软件包时(只需选择文件和文件夹,右键单击,然后添加到zip存档),AWS就会接受该软件包并且测试运行正常。

但是,当我在.NET中以编程方式构建软件包时,即使输出zip文件与手动构建的zip文件具有相同的文件夹结构,AWS也会拒绝它并显示以下错误消息:

"我们在您的测试包的 root 中找不到测试目录"

我尝试过3种不同的方法在.NET中以编程方式构建软件包。两种方法都会导致相同的错误。简而言之,方法如下:

1 /创建一个" TestPackage"包含"测试"的文件夹文件夹,"驾驶室"文件夹和" requirements.txt"文件。使用以下代码压缩整个TestPackage文件夹:

ZipFile.CreateFromDirectory("TestPackage", zipPath, CompressionLevel.Optimal, includeBaseDirectory: false);

includeBaseDirectory标志设置为false,以便所有文件夹和文件都位于zip文件的根目录中。

2 /创建一个空的zip文件。然后使用以下伪代码将所有文件(" requirements.txt"以及文件夹中的所有文件)添加到zip文件中:

using (var zipStream = File.Create(zipPath))
{
  using (var zipArchive = new ZipArchive(zipStream, ZipArchiveMode.Update))
  {
    // entryName is the relative path to the file
    // For eg., a file in the tests folder will have this path:
    // @"\tests\test_sample.py"
    zipArchive.CreateEntryFromFile(sourceFileName, entryName)
  }
}

3 /使用以下PowerShell脚本:

# Get the path to the AWSDeviceTests folder
# Assumption: the script file is in this folder
$ProjectDir = Split-Path -Path $MyInvocation.MyCommand.Path

# Get the paths of the test folders and file
$RequirementsFileDir = Join-Path -Path $ProjectDir -ChildPath "requirements.txt"
$TestsFolderDir = Join-Path -Path $ProjectDir -ChildPath "tests"
$WheelhouseFolderDir = Join-Path -Path $ProjectDir -ChildPath "wheelhouse"

# Zip the test folders and file
$ZipDestination = Join-Path -Path $ProjectDir -ChildPath "TestPackage.zip"
Compress-Archive -LiteralPath $RequirementsFileDir, $TestsFolderDir, $WheelhouseFolderDir -CompressionLevel Optimal -DestinationPath $ZipDestination

上述所有方法都失败了。 ZipFileZipArchive来自.NET中的System.IO.Compression

我想再次强调所有方法的输出zip文件与我手动构建的zip文件具有完全相同的文件夹结构,即所有必需的文件夹和文件都在zip文件的根目录中。虽然手动构建的文件有效,但以编程方式构建的文件并不适用。

我做错了吗?在.NET或Windows中构建AWS设备测试包是否存在已知问题?或者是否无法以编程方式构建测试包并将其上载到AWS Device Farm?如何在AWS Device Farm中解析/验证zip文件?

任何帮助或建议将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

过了一会儿,我发现了一些有趣的东西。每次我手动构建zip文件时,我都是这样使用7zip:选择文件和文件夹=>右键单击=> 7zip =>添加到" archiveName.zip"

相比之下,在我用于自动化构建过程的所有方法中,我使用的是看似Windows内置的zip功能(无论是什么; WinZip可能?)。

所以我决定再试一次,但在我的代码中使用7zip,它确实有效。以下是代码:

// Execute command line to zip the build file and folder using 7-zip
// Assumption: 7zip.exe is installed in this directory
Directory.SetCurrentDirectory(@"C:\Program Files\7-Zip");
string sevenZipExecutable = @"7z.exe";
string requirementsFile = projectDirectory + @"\requirements.txt";
string testsFolder = projectDirectory + @"\tests";
string wheelhouseFolder = projectDirectory + @"\wheelhouse";
string arguments = $"/C {sevenZipExecutable} a -tzip \"{zipPath}\" \"{requirementsFile}\" \"{testsFolder}\" \"{wheelhouseFolder}\"";
var startInfo = new ProcessStartInfo();
startInfo.FileName = "cmd.exe";
startInfo.Arguments = arguments;
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);

据此,我猜问题必定是7zip和Windows内置zip构建zip文件之间的一些模糊差异的结果。我想我的回答"并没有真正解释这种情况发生的原因或原因,但至少现在可以解决可能遇到这个问题的其他人。