【问题标题】:How to upload a file with unique name in Visual Studio Webtest如何在 Visual Studio Webtest 中上传具有唯一名称的文件
【发布时间】:2018-03-04 15:03:12
【问题描述】:

我使用 Visual Studio 2015 录制了一个网络测试,其中包括将文件上传到网站。本站不允许上传同名文件。在 webtest 场景中,我有一个 File Upload Parameter 属性 Generate Unique Name 设置为 True

但每次我尝试运行此 webtest 时,尝试上传文件时都会失败,因为给定名称的文件已经存在。

在我的项目文件夹中,我检查了 TestResults 文件夹,该文件夹复制了我需要上传的文件,并使用与记录相同的名称,而不是给它一个唯一的名称。

我已经看到有关此问题的一些建议,并尝试在我的.testsettings 文件中检查Enable deployment 选项,并在此检查下的“要部署的文件”部分中添加该文件的确切路径。但是还是没有解决问题。

UPD。调试单个 webtest 运行。

请求: 回应:

标题:

HTTP/1.1 500 Internal Server Error
X-AspNetMvc-Version : 5.2
Persistent-Auth : true
Content-Length : 312
Cache-Control : private, s-maxage=0
Content-Type : application/json; charset=utf-8
Date : Tue, 06 Mar 2018 14:42:48 GMT
Server : Microsoft-IIS/8.5
X-AspNet-Version : 4.0.30319
X-Powered-By : ASP.NET

主体:

0x00000000  7B  22  63  6F  6E  66  69  72  6D  61  74  69  6F  6E  22  3A    {"confirmation":
0x00000010  7B  22  6D  65  73  73  61  67  65  22  3A  22  D0  94  D0  BE    {"message":"....
0x00000020  D0  BA  D1  83  D0  BC  D0  B5  D0  BD  D1  82  20  D1  81  20    ............ .. 
0x00000030  D0  B8  D0  BC  D0  B5  D0  BD  D0  B5  D0  BC  20  5C  75  30    ............ \u0
0x00000040  30  32  37  32  6D  62  2E  70  64  66  5C  75  30  30  32  37    0272mb.pdf\u0027
0x00000050  20  D1  83  D0  B6  D0  B5  20  D1  81  D1  83  D1  89  D0  B5     ...... ........
0x00000060  D1  81  D1  82  D0  B2  D1  83  D0  B5  D1  82  2E  20  D0  A1    ............. ..
0x00000070  D0  BE  D0  B7  D0  B4  D0  B0  D1  82  D1  8C  20  D0  BD  D0    ............ ...
0x00000080  BE  D0  B2  D1  83  D1  8E  20  D0  B2  D0  B5  D1  80  D1  81    ....... ........
0x00000090  D0  B8  D1  8E  20  D0  B4  D0  BE  D0  BA  D1  83  D0  BC  D0    .... ...........
0x000000A0  B5  D0  BD  D1  82  D0  B0  3F  22  2C  22  73  68  6F  72  74    .......?","short
0x000000B0  4D  65  73  73  61  67  65  22  3A  22  D0  92  D0  B5  D1  80    Message":"......
0x000000C0  D1  81  D0  B8  D1  8F  20  D0  B4  D0  BE  D0  BA  D1  83  D0    ...... .........
0x000000D0  BC  D0  B5  D0  BD  D1  82  D0  B0  20  D0  BD  D0  B5  20  D0    ......... .... .
0x000000E0  BE  D0  B1  D0  BD  D0  BE  D0  B2  D0  BB  D0  B5  D0  BD  D0    ................
0x000000F0  B0  22  7D  2C  22  6D  65  73  73  61  67  65  22  3A  22  D0    ."},"message":".
0x00000100  92  D0  B5  D1  80  D1  81  D0  B8  D1  8F  20  D0  B4  D0  BE    ........... ....
0x00000110  D0  BA  D1  83  D0  BC  D0  B5  D0  BD  D1  82  D0  B0  20  D0    .............. .
0x00000120  BD  D0  B5  20  D0  BE  D0  B1  D0  BD  D0  BE  D0  B2  D0  BB    ... ............
0x00000130  D0  B5  D0  BD  D0  B0  22  7D                                    ......"}   

详情:

【问题讨论】:

  • 几个问题:(1)"In my project folder I check TestResults folder ..."是什么意思? (2) 响应头和正文是什么信息(如果有)? (3) “详细信息”选项卡中显示什么? (4) 运行一次测试后,保存在webserver上的文件叫什么名字?
  • 我怀疑Name参数可能是错误的。 null 这个名字是不是来自录音?您是否尝试使用 C# 值 null(表示没有字符串)? name字段为described as“获取或设置参数名称”
  • @AdrianHHH, (1) 当您运行 webtest 时,Visual Studio 在项目目录中创建 TestResult 文件夹,其中包含要上传的文件副本。我希望该文件具有用于上传的唯一名称。 (2) Response tab (3) Details tab (4) 2mb.pdf - 根据 fileName 参数。 (5) 是的,null 这个名字来自一段录音。现在我也明白它设置了参数名称。但是为什么我需要随机参数名称?那么设置随机文件名的正确方法是什么?
  • 我希望您edit 问题的额外细节。 (1) TestResult\... 文件夹保存上传的源文件。它没有唯一的名称。该名称应插入到上传请求中。 (2和3)图片没用,edit文成问题。 (4)我没有问参数。当您查看服务器时,我询问了文件名。 (5) 是你的网站和webtest,我们怎么知道为什么甚至是否需要随机文件名。
  • @AdrianHHH,(2 和 3)完成。 (4) 我说的是我在服务器中看到的文件名。这是2mb.pdf。我还提到了fileName 参数,因为我认为这决定了要上传的文件的名称。而且我不知道如何使它独一无二。 (5) 我确实需要随机的 file 名称。但现在对我来说,似乎某些 parameter 名称变得独一无二,我想不出任何可能的原因。这就是我的意思,当然我可能是错的。

标签: visual-studio load-testing web-testing webtest


【解决方案1】:

如果您以毫秒为单位上传许多文件,您可能会遇到麻烦,是吗?

供您参考,这是生成唯一文件名的实际代码,它使用毫秒分辨率的时间戳。

<!-- language: c# -->
internal string GenerateUniqueFileName()
    {
        string fileName = this.FileName;
        if (!string.IsNullOrEmpty(this.FileName))
        {
            string str = Path.GetFileName(this.FileName);
            if (!string.IsNullOrEmpty(str))
            {
                if (!this.m_useGuids)
                {
                    CultureInfo invariantCulture = CultureInfo.get_InvariantCulture();
                    object[] objArray = new object[2];
                    DateTime now = DateTime.get_Now();

                    //--- Here:
                    objArray[0] = now.ToString("ddMMyyyyhhmmssfff", CultureInfo.get_InvariantCulture());
                    objArray[1] = str;
                    str = string.Format(invariantCulture, "{0}{1}", objArray);
                }
                else
                {
                    Guid guid = Guid.NewGuid();
                    string str1 = guid.ToString().Replace("-", string.Empty);
                    str = string.Format(CultureInfo.get_InvariantCulture(), "{0}{1}", new object[] { str1, str });
                }
                fileName = str;
            }
            if (!string.IsNullOrEmpty(Path.GetDirectoryName(this.FileName)))
            {
                fileName = Path.Combine(Path.GetDirectoryName(this.FileName), fileName);
            }
        }
        return fileName;
    }

我试图重现您的错误,但它的行为符合预期。 我所做的唯一更改是在 PostParameter FileName 中设置一个绝对文件路径以使其运行,因为它没有正确复制到 MSTest 的 Out 文件夹。

你能展示更详细的单次运行 webtest 的调试吗?

请检查您的表单发布参数,它应该如下所示:

并且:如果生成唯一名称,则将文件上传名称留空:

【讨论】:

  • 现在还不到毫秒。我只是在录制后第二次尝试运行它,但上传文件失败。如果我去网站并手动删除上传的文件,那么在第一个测试将成功运行之后,我可以看到文件已上传。在主帖中添加了一些调试信息。够了吗?
  • @PavelNazimok 你上传了 2 个文件吗?一个带有“filename”的静态文件名和一个带有“null”的唯一文件名???在我的回答中查看我的编辑。
  • (1) 不,我只上传了一个名为 2mb.pdf 的文件。 Name: null 已自动记录。来自this MSDN 的文章看起来像是某个参数的名称,而不是文件的名称。现在我有点困惑... (2) 尝试了您的建议。现在文件即使是第一次也不会上传。而来自Request 选项卡的Form Post Parameters 现在只有一个参数file 具有随机名称(即current timestamp + 2mb.pdf)。之前它也有fileName参数。
  • @PavelNazimok 请用第二张截图检查我的第二次编辑。我仍然不确定您是否真的需要 2 个表单后参数输入。两者都有静态上传名称。当您在运行时的测试中没有收到错误时,请忘记我对绝对路径的评论
  • 但是您的第一个后参数输入行仍然存在?
【解决方案2】:

想出了一些解决方法。我从我的 .webtest 生成代码并将Guid.NewGuid() 添加到fileName 参数的值中。所以生成表单发布参数的代码如下所示:

FormPostHttpBody request2Body = new FormPostHttpBody();
request2Body.FormPostParameters.Add(new FileUploadParameter("null", "2mb.pdf", "application/pdf", true));
request2Body.FormPostParameters.Add("fileName", Guid.NewGuid() + "2mb.pdf");
request2.Body = request2Body;

基于此编码的 .webtest 制作了一个 .loadtest,它最终开始将 Guids 添加到在 loadtest 期间上传的文件的名称中。 也许这不是最好的解决方案,但尝试删除fileName 参数、将Name 参数值从null 更改为其他值等都没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多