Gallio 无法从控制台运行测试

发布于 2024-12-03 11:38:01 字数 6400 浏览 0 评论 0原文

我在通过 Gallio 运行集成测试时遇到问题。 当我使用 Testdrive.NET 或通过 Visual Studio 中的集成 Gallio 运行该测试时,该测试运行良好。当我尝试通过控制台运行它时(就像我们的 nant 脚本那样),它失败了。收到的消息是这样的:

[失败]测试 TenForce.Execution.Api2.OData.Tests/AttachmentIntegrationTests/Att achment上传执行 System.ServiceModel.CommunicationObjectFaultedException: 通信对象 System.Data.Services.DataServiceHost 不能 用于通信,因为它处于故障状态。在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan 超时)在 System.ServiceModel.ServiceHostBase.System.IDisposable.Dispose() 在 TenForce.Execution.Api2.OData.Tests.IntegrationTests.AttachmentIntegration Tests.AttachmentUpload() 中 D:\Users\arne.de.herdt.TENFORCE2\Documents\Developme nt\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\IntegrationTests\Attach mentIntegrationTests.cs:第 83 行

处置测试运行程序。停止时间:16:45(总执行时间: 20,515 秒)

1 次运行,0 次通过,1 次失败,0 次不确定,0 次跳过

完整的命令行如下:

Gallio.Echo.exe /r:IsolatedProcess TenFor ce.Execution.Api2.OData.Tests.dll /f:命名空间:TenForce.Execution.Api2.OData.Tes ts.IntegrationTests

我不知道是什么导致了 Gallio 中的这个问题。它可以在 VS 中运行,但不能在构建代理或控制台上运行。测试的源代码是这样的:

using System.Data.Services;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace TenForce.Execution.Api2.OData.Tests.IntegrationTests
{
    using System;
    using System.Collections.Generic;
    using System.ServiceModel.Web;
    using MbUnit.Framework;
    using Objects;
    using Helpers;
    using Test.Attributes;

    /// <summary>
    /// <para>This class contains all the integration tests to verify the correct working conditions for attachment entities.</para>
    /// </summary>
    public class AttachmentIntegrationTests : BaseIntegrationTest
    {
        /// <summary>
        /// <para>This test will try to create a new attachment on an item using a local file.</para>
        /// </summary>
        [Test, MaxDuration]
        public void AttachmentUpload()
        {
            #region Test Preparation

            // Prepare a Workspace
            var workspace = CreateWorkspaceObject();
            Assert.IsTrue(Factory.CreateApi().Workspaces.Create(workspace), "Expected the test workspace to be created.");

            // Prepare a List
            var list = CreateList();
            list.Workspace = workspace;
            list.ItemType = new ItemType {Id = 5};
            Assert.IsTrue(Factory.CreateApi().Lists.Create(list), "Expected the test list to be created.");

            // Prepare an Item.
            var itemFields = new List<ItemField>
                                     {
                                         new ItemField {FieldId = "SF19", Type = "List", ValueId = list.Id},
                                         new ItemField {FieldId = "SF2", Type = "Title", Value = string.Format("I {0}", DateTime.Now)},
                                         new ItemField {FieldId = "SF4", Type = "AssignedTo", ValueId = 1}
                                     };
            var item = new Item { ItemFields = itemFields.ToArray() };
            Assert.IsTrue(Factory.CreateApi().Items.Create(item), "Expected the test item to be created.");

            #endregion

            using (var host = new DataServiceHost(typeof (Web.Api), new[] {BaseUri}))
            {
                // Start the host
                host.Open();

                // Create a new WebClient to create a call to the attachments resource
                var client = new ODataClient {BaseUri = BaseUri, Username = "sadmin", Password = string.Empty};

                // Send the file contents to the service using the correct url.
                string response = client.UploadAttachment(GetTestFileLocation("ReportingTest.xls"), item.Id);
                var parser = new ODataParser();
                parser.LoadResponse(response);

                // Fetch the Id of the Attachment, this should be greater than 0.
                int attachmentId = parser.GetEntityId();
                Assert.IsTrue(attachmentId > 0, "Expected the Id to be greater than zero.");

                // Verify if the item is coupled to the correct Item.
                response = client.GetResource(string.Format("Attachments({0})/Item", attachmentId));
                parser.LoadResponse(response);
                int itemId = parser.GetEntityId();
                Assert.IsTrue(itemId == item.Id, "Expected the linked item to have a matching Id.");

                // Change the filename of the uploaded file and verify whether the file is properly renamed.
                client.UpdateProperty(string.Format("Items({0})/Attachments({1})/Filename/$value", itemId, attachmentId), "uploaded_excel.xls");

                // Verify if the changes made it to the database.
                Attachment att = Factory.CreateApi().Attachments.Read(attachmentId);
                Assert.AreEqual("uploaded_excel.xls", att.Filename, "Expected the data to be changed on the entity.");
                Assert.IsTrue(System.IO.File.Exists(Factory.CreateApi().Attachments.GetAttachmentPath(att, false)), "Expected the file to be present on the hard drive.");

                // Close the host properly
                host.Close();
            }
        }
    }
}

我是否遗漏了一些关于在单元测试中托管 DataService 的内容?

编辑1 运行以下命令:

netsh http add urlacl url=http://+:60000/ODataService/ 用户=管理员

解决了部分问题。我现在可以通过控制台在我的开发系统上毫无问题地运行测试,但构建代理仍然无法运行测试。他们推送以下输出:

执行 System.Net.WebException 失败:远程服务器返回 错误:(500) 内部服务器错误。状态:协议错误响应: System.Net.HttpWebResponse 在 System.Net.WebClient.UploadFile(Uri 地址、字符串方法、字符串文件名)位于 System.Net.WebClient.UploadFile(Uri 地址,字符串文件名) at System.Net.WebClient.UploadFile(字符串地址,字符串文件名)位于 TenForce.Execution.Api2.OData.Tests.Helpers.ODataClient.UploadAttachment(字符串 路径,Int32 itemId)中 c:\Robinson\trunk\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\Helpers\ODataClient.cs:line 69 于 TenForce.Execution.Api2.OData.Tests.IntegrationTests.AttachmentIntegrationTests.AttachmentUpload() 在 c:\Robinson\trunk\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\IntegrationTests\AttachmentIntegrationTests.cs:line 89 ------- 标准输出: ------- 无法读取配置部分 常见/记录。使用无操作实现。

i'm having a problem running an integration test through Gallio.
The test works fine when I run it with Testdrive.NET or through the integrated Gallio in Visual Studio. When I'm trying to run it through the console (like our nant scripts do) it fails. The message received is this:

[failed] Test
TenForce.Execution.Api2.OData.Tests/AttachmentIntegrationTests/Att
achmentUpload Execute
System.ServiceModel.CommunicationObjectFaultedException: The
communication objec t, System.Data.Services.DataServiceHost, cannot be
used for communication becaus e it is in the Faulted state. at
System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan
timeout) at
System.ServiceModel.ServiceHostBase.System.IDisposable.Dispose() at
TenForce.Execution.Api2.OData.Tests.IntegrationTests.AttachmentIntegration
Tests.AttachmentUpload() in
D:\Users\arne.de.herdt.TENFORCE2\Documents\Developme
nt\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\IntegrationTests\Attach
mentIntegrationTests.cs:line 83

Disposing the test runner. Stop time: 16:45 (Total execution time:
20,515 seconds)

1 run, 0 passed, 1 failed, 0 inconclusive, 0 skipped

The complete commandline is the following:

Gallio.Echo.exe /r:IsolatedProcess TenFor
ce.Execution.Api2.OData.Tests.dll
/f:Namespace:TenForce.Execution.Api2.OData.Tes ts.IntegrationTests

I have no idea what is causing this problem in Gallio. It works from VS but not on the build agent or console. The source code of the test is this:

using System.Data.Services;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace TenForce.Execution.Api2.OData.Tests.IntegrationTests
{
    using System;
    using System.Collections.Generic;
    using System.ServiceModel.Web;
    using MbUnit.Framework;
    using Objects;
    using Helpers;
    using Test.Attributes;

    /// <summary>
    /// <para>This class contains all the integration tests to verify the correct working conditions for attachment entities.</para>
    /// </summary>
    public class AttachmentIntegrationTests : BaseIntegrationTest
    {
        /// <summary>
        /// <para>This test will try to create a new attachment on an item using a local file.</para>
        /// </summary>
        [Test, MaxDuration]
        public void AttachmentUpload()
        {
            #region Test Preparation

            // Prepare a Workspace
            var workspace = CreateWorkspaceObject();
            Assert.IsTrue(Factory.CreateApi().Workspaces.Create(workspace), "Expected the test workspace to be created.");

            // Prepare a List
            var list = CreateList();
            list.Workspace = workspace;
            list.ItemType = new ItemType {Id = 5};
            Assert.IsTrue(Factory.CreateApi().Lists.Create(list), "Expected the test list to be created.");

            // Prepare an Item.
            var itemFields = new List<ItemField>
                                     {
                                         new ItemField {FieldId = "SF19", Type = "List", ValueId = list.Id},
                                         new ItemField {FieldId = "SF2", Type = "Title", Value = string.Format("I {0}", DateTime.Now)},
                                         new ItemField {FieldId = "SF4", Type = "AssignedTo", ValueId = 1}
                                     };
            var item = new Item { ItemFields = itemFields.ToArray() };
            Assert.IsTrue(Factory.CreateApi().Items.Create(item), "Expected the test item to be created.");

            #endregion

            using (var host = new DataServiceHost(typeof (Web.Api), new[] {BaseUri}))
            {
                // Start the host
                host.Open();

                // Create a new WebClient to create a call to the attachments resource
                var client = new ODataClient {BaseUri = BaseUri, Username = "sadmin", Password = string.Empty};

                // Send the file contents to the service using the correct url.
                string response = client.UploadAttachment(GetTestFileLocation("ReportingTest.xls"), item.Id);
                var parser = new ODataParser();
                parser.LoadResponse(response);

                // Fetch the Id of the Attachment, this should be greater than 0.
                int attachmentId = parser.GetEntityId();
                Assert.IsTrue(attachmentId > 0, "Expected the Id to be greater than zero.");

                // Verify if the item is coupled to the correct Item.
                response = client.GetResource(string.Format("Attachments({0})/Item", attachmentId));
                parser.LoadResponse(response);
                int itemId = parser.GetEntityId();
                Assert.IsTrue(itemId == item.Id, "Expected the linked item to have a matching Id.");

                // Change the filename of the uploaded file and verify whether the file is properly renamed.
                client.UpdateProperty(string.Format("Items({0})/Attachments({1})/Filename/$value", itemId, attachmentId), "uploaded_excel.xls");

                // Verify if the changes made it to the database.
                Attachment att = Factory.CreateApi().Attachments.Read(attachmentId);
                Assert.AreEqual("uploaded_excel.xls", att.Filename, "Expected the data to be changed on the entity.");
                Assert.IsTrue(System.IO.File.Exists(Factory.CreateApi().Attachments.GetAttachmentPath(att, false)), "Expected the file to be present on the hard drive.");

                // Close the host properly
                host.Close();
            }
        }
    }
}

Am I missing something in regards to hosting the DataService in the unit test?

EDIT 1
Running the following command:

netsh http add urlacl url=http://+:60000/ODataService/
user=administrator

Solved part of the problem. I can now run the test without problems fine on my development system through the console, but the build agents still can't run the test. They push the following output:

failed Execute System.Net.WebException: The remote server returned an
error: (500) Internal Server Error. Status: ProtocolError Response:
System.Net.HttpWebResponse at System.Net.WebClient.UploadFile(Uri
address, String method, String fileName) at
System.Net.WebClient.UploadFile(Uri address, String fileName) at
System.Net.WebClient.UploadFile(String address, String fileName) at
TenForce.Execution.Api2.OData.Tests.Helpers.ODataClient.UploadAttachment(String
path, Int32 itemId) in
c:\Robinson\trunk\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\Helpers\ODataClient.cs:line
69 at
TenForce.Execution.Api2.OData.Tests.IntegrationTests.AttachmentIntegrationTests.AttachmentUpload()
in
c:\Robinson\trunk\Projects\Robinson\TenForce.Execution.Api2.OData.Tests\IntegrationTests\AttachmentIntegrationTests.cs:line
89
------- Stdout: ------- Unable to read configuration section
common/logging. Using no-op implemenation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

哆兒滾 2024-12-10 11:38:01

我花了很长时间才弄清楚这一点,但问题不在于加里奥。
问题在于用于开发 OData 服务的工具包。该工具包无法从控制台托管环境运行。

将服务移至远程服务器并编写测试来远程调用函数并解析响应后,我们就实现了预期的行为。

Took me quite some time to figure this out, but the problem is not Gallio.
The problem is the toolkit used to develop the OData service. This toolkit is not able to run from a console hosting environment.

After moving the service to a remote server and writing tests to call the functions remotely and parse the responses, we got the intended behavior working.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文