Skip to content

Commit f08cc8f

Browse files
Chris Martinezcommonsensesoftware
authored andcommitted
Refactor acceptance tests to radically improve test performance
1 parent 0fe1598 commit f08cc8f

File tree

108 files changed

+832
-539
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+832
-539
lines changed

test/Acceptance.Test.Shared/Acceptance.Test.Shared.projitems

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@
1010
</PropertyGroup>
1111
<ItemGroup>
1212
<Compile Include="$(MSBuildThisFileDirectory)AcceptanceTest.cs" />
13+
<Compile Include="$(MSBuildThisFileDirectory)AgreementsCollection.cs" />
14+
<Compile Include="$(MSBuildThisFileDirectory)AdvancedODataCollection.cs" />
15+
<Compile Include="$(MSBuildThisFileDirectory)BasicODataCollection.cs" />
16+
<Compile Include="$(MSBuildThisFileDirectory)BasicCollection.cs" />
17+
<Compile Include="$(MSBuildThisFileDirectory)ConventionsODataCollection.cs" />
18+
<Compile Include="$(MSBuildThisFileDirectory)ConventionsCollection.cs" />
1319
<Compile Include="$(MSBuildThisFileDirectory)HttpContentExtensions.cs" />
20+
<Compile Include="$(MSBuildThisFileDirectory)HttpServerFixture.cs" />
1421
<Compile Include="$(MSBuildThisFileDirectory)OneApiError.cs" />
1522
<Compile Include="$(MSBuildThisFileDirectory)OneApiErrorResponse.cs" />
1623
<Compile Include="$(MSBuildThisFileDirectory)OneApiInnerError.cs" />

test/Acceptance.Test.Shared/AcceptanceTest.cs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,25 @@ namespace Microsoft.AspNetCore.Mvc
1313
using static System.Net.Http.HttpMethod;
1414

1515
[Trait( "Kind", "Acceptance" )]
16-
public abstract partial class AcceptanceTest : IDisposable
16+
#if WEBAPI
17+
[Trait( "Framework", "Web API" )]
18+
#else
19+
[Trait( "Framework", "ASP.NET Core" )]
20+
#endif
21+
public abstract class AcceptanceTest
1722
{
1823
const string JsonMediaType = "application/json";
1924
static readonly HttpMethod Patch = new HttpMethod( "PATCH" );
20-
readonly FilteredControllerTypes filteredControllerTypes = new FilteredControllerTypes();
21-
bool disposed;
25+
readonly HttpServerFixture fixture;
2226

23-
~AcceptanceTest() => Dispose( false );
27+
protected AcceptanceTest( HttpServerFixture fixture ) => this.fixture = fixture;
2428

25-
public void Dispose()
26-
{
27-
Dispose( true );
28-
GC.SuppressFinalize( this );
29-
}
29+
protected HttpClient Client => fixture.Client;
3030

3131
HttpRequestMessage CreateRequest<TEntity>( string requestUri, TEntity entity, HttpMethod method )
3232
{
33+
AddDefaultAcceptHeaderIfNecessary();
34+
3335
var request = new HttpRequestMessage( method, requestUri );
3436

3537
if ( !Equals( entity, default( TEntity ) ) )
@@ -38,18 +40,13 @@ HttpRequestMessage CreateRequest<TEntity>( string requestUri, TEntity entity, Ht
3840
request.Content = new ObjectContent<TEntity>( entity, formatter, JsonMediaType );
3941
}
4042

41-
Client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( JsonMediaType ) );
42-
4343
return request;
4444
}
4545

4646
HttpRequestMessage CreateRequest( string requestUri, HttpContent content, HttpMethod method )
4747
{
48-
var request = new HttpRequestMessage( method, requestUri ) { Content = content };
49-
50-
Client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( JsonMediaType ) );
51-
52-
return request;
48+
AddDefaultAcceptHeaderIfNecessary();
49+
return new HttpRequestMessage( method, requestUri ) { Content = content };
5350
}
5451

5552
protected virtual Task<HttpResponseMessage> GetAsync( string requestUri ) => Client.SendAsync( CreateRequest( requestUri, default( object ), Get ) );
@@ -67,5 +64,21 @@ HttpRequestMessage CreateRequest( string requestUri, HttpContent content, HttpMe
6764
protected virtual Task<HttpResponseMessage> PatchAsync( string requestUri, HttpContent content ) => Client.SendAsync( CreateRequest( requestUri, content, Patch ) );
6865

6966
protected virtual Task<HttpResponseMessage> DeleteAsync( string requestUri ) => Client.SendAsync( CreateRequest( requestUri, default( object ), Delete ) );
67+
68+
void AddDefaultAcceptHeaderIfNecessary()
69+
{
70+
var accept = Client.DefaultRequestHeaders.Accept;
71+
var comparer = StringComparer.OrdinalIgnoreCase;
72+
73+
foreach ( var item in accept )
74+
{
75+
if ( comparer.Equals( item.MediaType, JsonMediaType ) )
76+
{
77+
return;
78+
}
79+
}
80+
81+
accept.Add( new MediaTypeWithQualityHeaderValue( JsonMediaType ) );
82+
}
7083
}
7184
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.AspNet.OData.Advanced
3+
#else
4+
namespace Microsoft.AspNetCore.OData.Advanced
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( AdvancedODataCollection ) )]
11+
public sealed class AdvancedODataCollection : ICollectionFixture<AdvancedFixture>
12+
{
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.Web.Http.ByNamespace
3+
#else
4+
namespace Microsoft.AspNetCore.Mvc.ByNamespace
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( AgreementsCollection ) )]
11+
public class AgreementsCollection : ICollectionFixture<AgreementsFixture>
12+
{
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.Web.Http.Basic
3+
#else
4+
namespace Microsoft.AspNetCore.Mvc.Basic
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( BasicCollection ) )]
11+
public sealed class BasicCollection : ICollectionFixture<BasicFixture>
12+
{
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.AspNet.OData.Basic
3+
#else
4+
namespace Microsoft.AspNetCore.OData.Basic
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( BasicODataCollection ) )]
11+
public sealed class BasicODataCollection : ICollectionFixture<BasicFixture>
12+
{
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.Web.Http.Conventions
3+
#else
4+
namespace Microsoft.AspNetCore.Mvc.Conventions
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( ConventionsCollection ) )]
11+
public class ConventionsCollection : ICollectionFixture<ConventionsFixture>
12+
{
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#if WEBAPI
2+
namespace Microsoft.AspNet.OData.Conventions
3+
#else
4+
namespace Microsoft.AspNetCore.OData.Conventions
5+
#endif
6+
{
7+
using System;
8+
using Xunit;
9+
10+
[CollectionDefinition( nameof( ConventionsODataCollection ) )]
11+
public class ConventionsODataCollection : ICollectionFixture<ConventionsFixture>
12+
{
13+
}
14+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#if WEBAPI
2+
namespace Microsoft.Web
3+
#else
4+
namespace Microsoft.AspNetCore.Mvc
5+
#endif
6+
{
7+
using System;
8+
using System.Collections.Generic;
9+
#if !WEBAPI
10+
using Type = System.Reflection.TypeInfo;
11+
#endif
12+
13+
public abstract partial class HttpServerFixture : IDisposable
14+
{
15+
bool disposed;
16+
17+
~HttpServerFixture() => Dispose( false );
18+
19+
public void Dispose()
20+
{
21+
Dispose( true );
22+
GC.SuppressFinalize( this );
23+
}
24+
25+
public ICollection<Type> FilteredControllerTypes { get; } = new FilteredControllerTypes();
26+
}
27+
}

test/Microsoft.AspNet.WebApi.Acceptance.Tests/AcceptanceTest.cs

Lines changed: 0 additions & 91 deletions
This file was deleted.

0 commit comments

Comments
 (0)