çŸåšãNCrunchã¯AutoFixtureããµããŒãããŠããããããã¯ããã¥ã¡ã³ãã«æ確ã«èšèŒããåé¡ãããããããè€éãªåé¡ã§ããããã«æãããxUnitãã¬ãŒã ã«ããäœãšãããã解決ããããšããŸããã
ããã§NCrunchéçºè ãæåŸ ããŠããã®åé¡ã«ã€ããŠäžç·ã«è©±ãåããŸãã ããããããããããã«xUnitãµãŒãã§ã¹ã«ç§»åããããšãã§ããŸãã
ã©ã¡ããéåžžã«äººæ°ã®ãã補åã§ããããšãèãããšãNCrunchã䜿çšããæ¹æ³ãèŠã€ããå¿ èŠããããŸãð
ããã«ã¡ã¯ãç§ã¯NCrunchã®éçºè ã§ãã
ããã«å¯Ÿãã解決çãèŠã€ããããã«ããªããšååã§ããã°å¹žãã§ãã çŸåšã®èšèšã§ã¯ãæ®å¿µãªãããçµ±åãã€ã³ãã®èªåã®åŽã ãã§åé¡ã解決ããããã®ãªãã·ã§ã³ããããŸããã çŸåšã®ãã¶ã€ã³ã§åé¡ãçµéšããã®ã¯ç§ã®ã©ã³ããŒã ãã§ã¯ãªããšæããŸãã
ç§ãæžããããŸããŸãªããã¥ã¡ã³ãããµããŒããã©ãŒã©ã ã®æçš¿ããç解ã§ãããšæããŸãããåé¡ã®æ ¹æ¬ã¯AutoFixtureã«ãããã¹ããã©ã¡ãŒã¿ã®ã©ã³ãã ãªçæã«ãããŸãã ãã¹ããã©ã¡ãŒã¿ã¯ããã¹ããèå¥ããŠå®è¡ããäžã§éèŠãªèŠçŽ ã§ããããããã¹ããæ§ç¯/æ€åºããããã³ã«ãã©ã¡ãŒã¿ãå€æŽããããšããã¹ããéžæçã«å®è¡ã§ããªããªããŸãã
ãã®åé¡ã解決ããããã«ç§ãèããããšãã§ããå¯äžã®ä¿¡é Œã§ããæ¹æ³ã¯ããã¹ããã©ã¡ãŒã¿ãŒã®ã©ã³ãã ãªçæããã¹ãŠåé€ãã代ããã«åºå®å€ïŒã€ãŸãããã¬ãŒã¹ãã«ããŒãŸãã¯å®æ°ïŒã䜿çšãããããã©ã¡ãŒã¿ãŒå€ã®ã·ãŒãããã¹ãã±ãŒã¹èªäœã«å¶éããããšã§ãã ãã®ããã«ããã¹ãã¯åžžã«ãŸã£ããåãã§ãããä»ã®ãã¹ããšäžè²«ããŠåãã§ããããšãããããŸãã ç§ãæ±ã£ããã¹ãŠã®ãŠãŒã¶ãŒã¯ããã©ã¡ãŒã¿ãŒçæã«AutoFixtureã䜿çšããŸãããããã¹ãã®ç®çã§ãæ°ã«ããªãããã©ã¡ãŒã¿ãŒã«ã€ããŠã¯ããããŸããããããã£ãŠããã®ã¢ãããŒãããŠãŒã¶ãŒã®ç®ã«ã¯å®éã®æ¬ ç¹ããªãããšãé¡ã£ãŠããŸãã ã ããã®å©ç¹ã¯ãNCrunchã®ãã¹ãŠã®ããŒãžã§ã³ã§ãããã«æ©èœããNCrunchããã®ä»ã®ã©ã³ããŒã®ã³ãŒããå€æŽããå¿ èŠããªãããšã§ãã
@remcomulderããã«åå ããŠããã ãããããšãããããŸã-éåžžã«æè¬ããŠããŸãïŒ ç§ã¯ãããå°ã調æ»ããŸããããããŠç§ã®çºèŠãå ±æããããšæããŸãã ç§ã®èª¿æ»çµæã¯ãã¹ãŠxUnitã«ã®ã¿é©çšãããŸãã
TL DRïŒ xUnitã¯ãã®ãããªçè«ããµããŒãããŠãããNCrunchã¯xUnitã§ããããããµããŒãããå¿ èŠããããŸãã NUnitã®å Žåãããã¯æªè§£æ±ºã®è³ªåã§ããããŸã 調æ»ããŠããŸããã
ç§ãã¡ã䜿çšããŠããæ©èœã¯ãxUnitã®_åæ³_ã®ããã§ãã ç¬èªã®TestDataDiscovererããããçè«ãäºåã«çºèŠã§ããªãããšã瀺ããŠããŸãïŒã©ã³ãã ããŒã¿ãçæããããïŒã åŸã§ããã®æ€åºåšã§ã¯ãã®å±æ§ã
çŸåšã®ãã¶ã€ã³ã§åé¡ãçµéšããã®ã¯ç§ã®ã©ã³ããŒã ãã§ã¯ãªããšæããŸãã
å®éãããã¯çå®ã§ã¯ãªããRïŒãšVSã®äž¡æ¹ããã®ãããªçè«ã§ããŸãæ©èœããŸãã ãŸããèªåçæãããããŒã¿ãå«ãŸããŠããå Žåã§ããç¹å®ã®çè«ãåå®è¡ããããšãã§ããŸãã VSã«ã¯æ€åºãšå®è¡ã®ãã§ãŒãºãå«ãŸããŠããããªãŒãã³ãœãŒã¹ã§ãããããVSã«çŠç¹ãåœãŠãããšããå§ãããŸãã
次ã®ãã¹ãã³ãŒããæ€èšããŠãã ããã
using Ploeh.AutoFixture.Xunit2;
using Xunit;
namespace Playground
{
public class UnitTest
{
[Fact]
public void StableTest()
{
Assert.True(true);
}
[Theory]
[InlineData(1)]
public void StableInlineTest(int value)
{
Assert.Equal(1, value);
}
[Theory, AutoData]
public void VolatileTest(int value)
{
Assert.True(value % 2 == 0);
}
[Theory]
[InlineAutoData(10)]
[InlineAutoData(20)]
[InlineAutoData(30)]
public void VolatileTestWithInline(int value, int autoValue)
{
Assert.NotEqual(value, 40);
}
}
}
.NETFrameworkãã¹ãã©ã€ãã©ãªãããžã§ã¯ãã VS2017.3ã ã¿ãŒã²ãããã¬ãŒã ã¯ãŒã¯ïŒ4.5.2ã ã€ã³ã¹ããŒã«ãããŠããããã±ãŒãžïŒ
xunit
2.2.0xunit.runner.visualstudio
2.2.0AutoFixture
3.50.6AutoFixture.Xunit2
3.50.6VSã§æ€åºãããªã¬ãŒãããšã次ã®åºåã衚瀺ãããŸãã
ãæ°ã¥ããããããŸããããããŒã¿æ€åºããµããŒãããçè«ïŒ StableInlineTest
ïŒã®å ŽåãVSã©ã³ããŒã¯ãã¹ããå®è¡ãããå®éã®ããŒã¿ïŒ 1
ïŒã衚瀺ããŸãã ããŒã¿æ€åºããµããŒããããèªåçæãããããŒã¿ïŒ VolatileTest
ã VolatileTestWithInline
ïŒãå«ããã¹ãã®å ŽåãVSã¯çè«ã®ã±ãŒã¹ãæ€åºãããçè«å
šäœã®ã¿ã衚瀺ããŸãã å®è¡ããåŸã§ã®ã¿ããã®ç¹å®ã®åŒã³åºãã®å€ã確èªã§ããŸãã
ããã§ãç¹å®ã®çè«ãåå®è¡ã§ãã_ãã¹ãŠã®çè«ã±ãŒã¹_ãå床å®è¡ãããŸãã
ã芧ã®ãšãããå®éã«ã¯ãã®ãããªçè«ããµããŒãããæ¹æ³ããããxUnitã¯ãããå®å šã«å®è¡ããŸãã NCrunchã¯ãäžéšã®çè«ã±ãŒã¹ãäºåã«çºèŠã§ããªããšããäºå®ãèæ ®ã«å ¥ããå¿ èŠããããŸãã ãã®ãããªçè«ã§ã¯ãç¹å®ã®ã±ãŒã¹ã§ã¯ãªããçè«å šäœãåå®è¡ããå¿ èŠããããŸãã ãããäžå¯èœãªçç±ãããããŸããã
ãã®åé¡ã解決ããããã«ç§ãèããããšãã§ããå¯äžã®ä¿¡é Œã§ããæ¹æ³ã¯ããã¹ããã©ã¡ãŒã¿ã®ã©ã³ãã ãªçæããã¹ãŠåé€ãã代ããã«åºå®å€ïŒã€ãŸãããã¬ãŒã¹ãã«ããŒãŸãã¯å®æ°ïŒã䜿çšããããšã§ãã
çŸåšãxUnitã¯ã衚瀺åãå€æŽããããçæãããããŒã¿ããã¬ãŒã¹ãã«ããŒã«çœ®ãæãããããããã®APIãå ¬éããŠããŸããã ç§ã¯åœŒãã®ããã«åé¡ãäœæããŸããïŒãããåç §ïŒãããããã©ããã®è¿äºã¯ãããéçŸå®çã§ããã圌ãã¯åã«ç§ãã¡ããã§ã«è¡ã£ãŠããçºèŠãç¡å¹ã«ããããšãææ¡ããŠãããšããããšã§ãã
ãŸãã¯ããã©ã¡ãŒã¿å€ã®ã·ãŒãããã¹ãã±ãŒã¹èªäœã«å¶éããŸãã
æ®å¿µãªãããçŸåšã®ãšãããããã¯åœç€Ÿã®è£œåã§ã¯äžå¯èœã§ãããåäžã®ã·ãŒãããµããŒãããããã«å€ãã®ããšãæžãçŽãå¿ èŠããããŸãã
ããã®ããã¥ã¡ã³ãã«ã¯ãå¥ã®ãµã³ãã«ããããŸãïŒXUnitã«æžãçŽããŸããïŒã
public class MemberDataSample
{
public IEnumerable<object[]> GetData()
{
yield return new object[]
{
DateTime.Now
};
}
[Theory, MemberData(nameof(GetData), DisableDiscoveryEnumeration = true)]
public void DateTheory(DateTime dt)
{
Assert.True(DateTime.Now - dt < TimeSpan.FromMinutes(1));
}
}
DisableDiscoveryEnumeration
å±æ§ããããããxUnitã§ã¯çµ¶å¯Ÿã«åæ³ã§ãã äžèšã®ãµã³ãã«ã®ããã«æ©èœããŸã-çè«äžã®ã±ãŒã¹ã¯äºåã«çºèŠãããŠããŸããã
çµè«
xUnitã¯ããã¹ããæ®çºæ§ã§ãããã©ãããç解ããããã®æ段ãæäŸããŠããããã§ãïŒæ€åºåã®åæãµããŒãã«ãã£ãŠïŒã VSå®è£ ããµã³ãã«ãšããŠäœ¿çšããŠãVSå®è£ ããããã©ã®ããã«åŠçããããç解ãã補åã§åãããšãè¡ãããšãã§ããŸãã ããããã圌ãã¯åã«xUnitSDKãšãã®ã¡ãã»ãŒãžã·ã³ã¯ã䜿çšããŠããŸãã
RïŒãšVSã®äž¡æ¹ããã®ãããªåªããçè«ããµããŒãããŠããããšãèãããšãå®éã«ã¯ãã¹ãŠãç§ãã¡ã®è£œåã§æ£ãããšæããŸãã
NUnitã«ã€ããŠã¯ããŸã 調æ»ããŠããªãã®ã§ãåŸã§èª¬æããŸãããã ããããããã®ãããªAPIã¯ãããŸããã
ç§ã®èª¿æ»çµæãèžãŸããŠãxUnitãµããŒãã«é¢ãããæèŠããèãããã ããã ã®ãµããŒããè¿œå ããŸãã
xUnitïŒãã¹ãŠã®ãã¹ãã®åå®è¡ãåæ¢ïŒãšåæ¢ããŠãéäºææ§ã®èŠåã衚瀺ããŸããïŒ ð
ããã§ãè©«ã³ãããããããŸããã äžèšã§èª¬æãããŠãŒã¹ã±ãŒã¹ã¯ã説æããçç±ã«ãããNCrunchã§æ£ããæ©èœããŸãã Xunitã¯çè«ã®äºååæãåé¿ããããã1ã€ã®ãã¹ãã«ãŸãšããŠãå®å šã«èå¥ããŠå®è¡ããŸãã ãããä»ãã¹ããããšãNCrunchããããæ£ããè¡ãããšã確èªã§ããŸãã InlineAutoDataã«æãããªåé¡ã¯ãªãããã§ãã
ãªãããã以åã«å€±æããã®ãããããŸããã ç§ã¯çŸåšã倱æããã·ããªãªãèªåã§äœæããããšã¯ã§ããŸããã InlineAutoDataãæ©èœããŠããªããšãŠãŒã¶ãŒããèšãããããšã¯ç¥ã£ãŠããŸããããŠãŒã¶ãŒãåã«åºãŠããããåœãŠã¯ãŸãäŸãæäŸããå¿ èŠããããšæããŸãã
NCrunchãšVSRunnerã®äž¡æ¹ãå£ããããšãç§ãç¥ã£ãŠããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æ³šæãåããããšæããŸãã ReSharperãšTD.NETãç ŽæãããšæããŸãããã€ã³ã¹ããŒã«ããŠããªãããããããããã¹ãããŠããŸããã
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.Xunit2;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace XUnitAutoFixture
{
public class TestFixture
{
private static readonly Fixture Fixture = new Fixture();
public static IEnumerable<object[]> SomeTestData()
{
yield return new object[] { Fixture.Create<string>() };
yield return new object[] { Fixture.Create<string>() };
}
[Theory, MemberData(nameof(SomeTestData))]
public void Test(object value)
{
}
}
}
äžèšã®ã³ãŒãã¯ããã¹ãŠã®éžæçå®è¡ã·ããªãªã§å€±æããŸãã ãã ããåãã¹ãããã§ãã¹ããæ€åºãããŠå®è¡ãããå Žåã¯åæ Œã§ãã ãã®ã·ããªãªã¯ããŠãŒã¶ãŒããããå®è¡ããŠãµããŒããæ±ããŠãããšãã«ãAutoFixtureã«ã€ããŠNCrunchã«ãã£ãŠèŠåãåºãããèæ¯ã«ãã觊åªã§ããã AutoFixtureãäºååæãç¡å¹ã«ããããšãç¥ããªãã£ãã®ã§ãInlineAutoDataã¯åãã§ãããšïŒèª€ã£ãŠïŒæ³å®ããŠããŸããã
ç§ã®çŸåšã®ä»®å®ã¯ãããªãããã®ãããªã·ããªãªããµããŒãããŠããªããšããããšã§ãã ããã¯æ£ããã§ãïŒ
ãããä»ãã¹ããããšãNCrunchããããæ£ããè¡ãããšã確èªã§ããŸãã
ããã¯çŽ æŽãããããšã§ãïŒ å®éã«xUnitã¯NCrunchã«ãã£ãŠå®å šã«ãµããŒããããŠãããšèããŠããããã§ãðNUnitã«é¢ããŠã¯ãåžžã«äžåšçšã§ãããããã§äœãã§ãããã調æ»ããå¿ èŠããããŸãã
ãã ããNCrunchãšAutoFixtureã®åé¡ã¯ãŸã çºçããŠããŸãã çŸåšãAutoFixtureã䜿çšããxUnitãããžã§ã¯ããããã1è¡ã§ãå€æŽãããšããã¹ãŠã®ãã¹ããåå®è¡ãããŸãã AutoFixtureãæ€åºãããšããã®ãããªåäœãæå¹ã«ããŠãèŠéãããªãããšã確èªããŠããããã§ãã
ããã§ããïŒ ã¯ãã®å Žåããã¹ãŠãæ£åžžã§ãããããxUnitã®ãã®ãããªåäœãç¡å¹ã«ããããã«ä¿®æ£ããŠãã ããã
NCrunchãšVSRunnerã®äž¡æ¹ãå£ããããšãç§ãç¥ã£ãŠããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æ³šæãåããããšæããŸãã
ç§ã®çŸåšã®ä»®å®ã¯ãããªãããã®ãããªã·ããªãªããµããŒãããŠããªããšããããšã§ãã ããã¯æ£ããã§ãïŒ
ããããã®ã·ããªãªã¯ãã¹ãŠã®ã©ã³ããŒãå£ããŸãã ãã ãããã©ãŒã©ã ã®ã©ããã§æ£ããææãããŠããã®ã§ãAutoFixtureã®ããã§ã¯ãããŸããã次ã®ããã«èšè¿°ããŠãæ©èœããªãå¯èœæ§ãããããã次ã®ããã«ãªããŸãã
public class TestFixture
{
public static IEnumerable<object[]> SomeTestData()
{
yield return new object[] { DateTime.Now.Ticks };
yield return new object[] { DateTime.Now.Ticks };
}
[Theory, MemberData(nameof(SomeTestData))]
public void Test(object value)
{
}
}
ãã®ãããªã·ããªãªã§ã¯ãäºåæ€åºãæåã§ç¡å¹ã«ããŠã次ã®ããã«ããå¿
èŠããããŸãïŒ DisableDiscoveryEnumeration
ããããã£ã«æ³šæããŠãã ããïŒã
public class TestFixture
{
private static readonly Fixture Fixture = new Fixture();
public static IEnumerable<object[]> SomeTestData()
{
yield return new object[] { Fixture.Create<string>() };
yield return new object[] { Fixture.Create<string>() };
}
[Theory, MemberData(nameof(SomeTestData), DisableDiscoveryEnumeration = true)]
public void Test(object value)
{
}
}
æã
ãæã£ãŠãããšããŠãå®éã«ãéåžžã«ãŸããªã·ããªãªãããããšã«ãªã£ãŠããŸãAutoData
ãšInlineAutoData
ããŒã¿çæã®ããã®å±æ§ãã ãŸããAutoFixtureã¯åãªãããŒã«ã§ãããæ£ãã䜿çšããã®ã¯éçºè
ã®è²¬ä»»ã§ãã
ããŒã«ã誀ã£ãŠäœ¿çšã§ãã人ããããšããçç±ã ãã§ãNCrunchãç¹å¥ãªã¢ãŒãã«ç§»è¡ããããšã¯ããŸããã ããã§ã§ããæåã®ããšã¯ãæ¢ç¥ã®åé¡ãã©ããã«çœ®ããŠããã®ç¹å®ã®ã·ããªãªã説æããxUnitãé©åã«äœ¿çšããããã«äººã ã«äŸé Œããããšã§ãïŒåœŒãã¯ããã«ã€ããŠç¥ããªããããããŸããïŒã
AutoFixtureãæ€åºããå Žåã¯ãç¹å¥ãªæ¹æ³ã§ãã¹ããå®è¡ããŠããããšã確èªããŠãã ãããå®è¡ããŠããå Žåã¯ãxUnitã®ã¢ãŒããç¡å¹ã«ããŠãã ããïŒNUnitã®å Žåã¯ãã®ãŸãŸã«ããŠããããšããå§ãããŸãïŒã ãŸãããã®ããŒãžãæŽæ°ããå¿ èŠãããå¯èœæ§ããããŸãã
çŸæç¹ã§ã¯ãNCrunchã¯ãäºææ§ã®èŠå以å€ã«AutoFixtureã®ç¹å¥ãªåŠçãå®è£ ããŠããŸããã çµéšããåäœã¯ãããããéžæãããšã³ãžã³ã¢ãŒããåå ã§ãã å®å šã«æ§æå¯èœã§ããã圱é¿ãåãããã¹ããèªåçã«å®è¡ããä»ã®ãã¹ããæåã§å®è¡ãããã¢ãŒãã«åãæ¿ãããšããšã³ãžã³ãæåŸ ã©ããã«åäœããããšãããããŸãã
ç§ãããªãããåŠãã ããšã§ãNCrunchããAutoFixtureèŠåãå®å šã«åé€ããæºåãã§ããŠãããšæããŠããŸãã èŠåãåºãããŠãAutoFixtureã®äžéšã®æ©èœããŸã æ£ããæ©èœããŠããããšãéåžžã«æ©ã段éã§æããã«ãªã£ãã®ã§ãç§ã¯ãã§ã«ãŠãŒã¶ãŒã«ãããèšãæããããã«èª¬åŸããŠããŸããã AutoFixtureãxunitã§ã©ã®ããã«å®è£ ãããŠããããããªãçå£ã«èª€è§£ããŠãããšæããŸãã
ãããã£ãŠãããã¯ããããç§ãã¡ã«ãšã£ãŠæè¯ã®ã·ããªãªã ãšæããŸãã ç§ãæãã²ã©ãå£ãããŠãŒã¹ã±ãŒã¹ã¯ããšã«ããæè¡çã«ãµããŒããããŠããããä»ã®ãã¹ãŠã¯æ£åžžã«æ©èœããŠããŸãã ãã®éãç±å¿ãªäºææ§ã®èŠåã«ã€ããŠç§ãèš±ãåå ãèŠã€ããããšãã§ããã°ãããããã¹ãããŠééã£ãçµè«ã«æ€èšŒããããšã«å¯Ÿããç§èªèº«ã®æ¥ãããããå¿ããããšããããšãå¬ããæããŸãã
ãã®éãç±å¿ãªäºææ§ã®èŠåã«ã€ããŠç§ãèš±ãåå ãèŠã€ããããšãã§ããã°ãããããã¹ãããŠééã£ãçµè«ã«æ€èšŒããããšã«å¯Ÿããç§èªèº«ã®æ¥ãããããå¿ããããšããããšãå¬ããæããŸãã
å¿é ãªãïŒ ããã¯çµ¶å¯Ÿã«å€§äžå€«ã§ãããããŠç§ãã¡ã¯ãäºããç©äºãç解ããã®ãå©ããããã«ããã«ããŸãð ããªãããã±ããããã©ããŒã¢ããããŠç§ãã¡ãããã«ã€ããŠè©±ãåã£ãããšã¯çŽ æŽãããããšã§ã-ããã¯å€ãããŸãð¥
ç§ãããªãããåŠãã ããšã§ãNCrunchããAutoFixtureèŠåãå®å šã«åé€ããæºåãã§ããŠãããšæããŠããŸãã
ãããšãç§ãã¡ã¯ãŸã NUnitã«åé¡ãæ±ããŠããã®ã§ïŒç§ãã¡ã¯éäžã§ããïŒããã®ã¡ãã»ãŒãžã¯NUnitãããžã§ã¯ãã«é¢é£ããŠããããã«èŠããŸãã ãããããNUnitã®å®å šãªãµããŒãïŒãŸãã¯å°ãªããšããã®ãµããŒããæå¹ã«ããæ¹æ³ïŒãå°å ¥ããªãéããxUnitã«å¯ŸããŠã®ã¿ãããç¡å¹ã«ããããšã¯çã«ããªã£ãŠããŸãã
ãŸã ã¯ã£ããããªãããšã1ã€ãããŸãã AutoFixtureïŒNUnitãªã©ããµããŒãããŠããªããšã¯ã©ãããæå³ã§ããïŒ ã¯ãããã¹ãåã¯æ¯åç°ãªããŸããããã¹ãŠã®ãã¹ããåå®è¡ãããã©ããã¯éèŠã§ããïŒãšã³ãžã³ã¢ãŒããèšå®ãããŠããå ŽåïŒïŒ ãããšããã圱é¿ã®ã¿ãã®ãšã³ãžã³ããµããŒãããªããšããããšã§ããïŒ ç§ã®èãã§ã¯ã No support
ãšèšã代ããã«ããµããŒããããŠããªãç¹å®ã®ã·ããªãªã«çµã蟌ãã ã»ããããã§ãããããæ®ãã®ã·ããªãªã¯åé¡ãªãã¯ãã§ãã
ã圱é¿ãåãããã¹ããèªåçã«å®è¡ããä»ã®ãã¹ãã¯æåã§å®è¡ããã
3.10.0.20
ã€ã³ã¹ããŒã«ã§ãã®èšå®ãèŠã€ããããšãã§ããŸããOnly consider tests 'Out of date' if they are 'Impacted'
ã«èšå®ããå¿
èŠãããããã®èšå®true
ïŒ ã©ããã§èŠéããŠããŸã£ããããããªãã-ç§ã¯ãã®è£œåã«å°ãæ
£ããŠããŸããã
ãã®ããŒãžããxUnitãšAutoFixtureã®ã±ãŒã¹ã_åé€_ããã®ã§ã¯ãªããæ£ãã䜿çšããæ¹æ³ã説æããããšã¯ããããçã«ããªã£ãŠããŸãïŒ DisableDiscoveryEnumeration
å±æ§ã䜿çšããŠãã ããïŒã ãŸããxUnitã®ãååãäžè²«ããŠããªãNUnitãã¹ãã±ãŒã¹ãã®ãµã³ãã«ã説æãã DisableDiscoveryEnumeration
å±æ§ãMemberDataAttribute
ãšäžç·ã«äœ¿çšããããã«äŸé Œããã®ãããã§ãããã
ãŸã ã¯ã£ããããªãããšã1ã€ãããŸãã AutoFixtureïŒNUnitãªã©ããµããŒãããŠããªããšã¯ã©ãããæå³ã§ããïŒ ã¯ãããã¹ãåã¯æ¯åç°ãªããŸããããã¹ãŠã®ãã¹ããåå®è¡ãããã©ããã¯éèŠã§ããïŒãšã³ãžã³ã¢ãŒããèšå®ãããŠããå ŽåïŒïŒ ãããšããã圱é¿ã®ã¿ãã®ãšã³ãžã³ããµããŒãããªããšããããšã§ããïŒ ç§ã®èãã§ã¯ããµããŒããªããšèšã代ããã«ããµããŒããããŠããªãç¹å®ã®ã·ããªãªã«çµã蟌ãã ã»ããããã§ãããããæ®ãã®ã·ããªãªã¯åé¡ãªãã¯ãã§ãã
ããã¯ãNCrunchã§ã®ãã¹ãã®å¯¿åœãåå ã§ãã NCrunchã«ã¯ããã¹ãŠã®ãã¹ãã«å²ãåœãŠãããéèŠãªç¶æ ããããŸãïŒåæ Œ/äžåæ Œã®çµæãã³ãŒãã«ãã¬ããžããŒã¿ãããã©ãŒãã³ã¹ããŒã¿ããã¬ãŒã¹åºåãªã©ãèããŠãã ããïŒã ãã®ããŒã¿ã¯ãVSã®ã»ãã·ã§ã³éã§ãã£ãŠãããã¹ããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãã¹ãããæ€åºãããç¶ããéãåç¶ããŸãã ãã¹ããã¬ãŒã ã¯ãŒã¯ãåãèå¥åã®ãã¹ããå ±åããªãå Žåããã¹ãã¯çµäºãããšèŠãªããããã¹ãŠã®ç¶æ ãç Žæ£ãããŸãã
äžå®å®ãªãã©ã¡ãŒã¿ãŒã䜿çšããŠãã¹ããäœæãããšããã¹ããã¬ãŒã ã¯ãŒã¯ãåŒã³åºããŠãã¹ãçµæãæ€åºãããã³ã«ããã¹ãã®èå¥åãå€æŽãããããããŸã£ããæ°ãããã¹ããäœæãããŸãã ãã®çµæãNCrunchãNUnitãåŒã³åºããŠãã¹ããæ€åºãããã³ã«ïŒäžè²«ããŠãã¹ããããžã§ã¯ãã®ãã«ãããšã«ïŒãäžå®å®ãªãã©ã¡ãŒã¿ãŒã䜿çšãããã¹ãã§ä¿æãããŠãããã¹ãŠã®ç¶æ ãç Žæ£ãããŸãã ã ããããã¯æªãã§ãã ããã¯ã圱é¿æ€åºãæ©èœããããšã³ãžã³ããã¹ããåå®è¡ããŠäžæçãªçµæãããªãã¯ããããã«å€§éã®è¿œå äœæ¥ãè¡ãããšãæå³ããŸãã
ããããåé¡ã¯ããã«æ·±ããªããŸãã ãã¹ãç¶æ ã®ãã³ããå¯äžã®å®éã®åé¡ã§ããå Žåãäžå®å®ãªãã¹ãã®åŠçã¯ããšã³ãžã³ã«ãã£ãŠå®è¡ãããçµæãå ±åããããšããæå³ã§ãæ©èœãããå¯èœæ§ããããŸãã ããæ·±å»ãªåé¡ã¯ãNCrunchã®äžŠååãéžæçå®è¡ãåæ£åŠçã«èµ·å ããŸãã
䞊åå®è¡ãå®è¡ããã«ã¯ãNCrunchã¯ãã¹ãã䞊åã«å®è¡ããè€æ°ã®ãã¹ãããã»ã¹ã䜿çšããå¿ èŠããããŸãã NUnitã®ä»çµã¿ã¯ããã¹ããå®è¡ããåã«ãã¹ããæ€åºããå¿ èŠããããšãããã®ã§ãã ã€ãŸããå®è¡ã«äœ¿çšãããåããã»ã¹å ã§å®å šã«åå¥ã®æ€åºã¹ããããå®è¡ããå¿ èŠããããããããã»ã¹ã2ã€ããå Žåã¯ããã¹ãã2åæ€åºããå¿ èŠããããŸãã ãã¹ãã®ãã©ã¡ãŒã¿ãŒãäžå®å®ãªå Žåãåããã»ã¹ã«ã¯ãŸã£ããç°ãªããã¹ãã»ãããå«ãŸããããããšã³ãžã³ããã¹ãã®å®å šãªãã¹ã¿ãŒãªã¹ããããã»ã¹éã§åå²ããŠå®è¡ããããšã¯ã§ããŸããã ãªã¢ãŒãå®è¡ããã»ã¹ã¯å®å šã«ç°ãªãç°å¢ã®ç°ãªãããŒããŠã§ã¢ã§å®è¡ãããŠãããããåæ£åŠçã䜿çšããå Žåã«ããã®åé¡ã¯æ¡å€§ããŸãã
éžæçå®è¡ã®åé¡ããããŸãã NCrunchã®ããã©ã«ãã®åäœã¢ãŒãã¯ããã¹ããå®è¡ããããã«ç¹ã«æ瀺ããããšãã«ãåžžã«æ°ãããã¹ãããã»ã¹ãäœæããããšã§ãã ããã¯ãã¹ã¬ãŒããã¯ãªã¢ããä»ã®ã©ã³ããŒãšå¯èœãªéãäžè²«æ§ãä¿ã€ããã§ãã æ°ãããã¹ãããã»ã¹ãçæããã«ã¯ãã¹ããåæ€åºããå¿ èŠãããããããã®ãããªæ©èœã¯äžå®å®ãªãã©ã¡ãŒã¿ãŒã§ã¯æ©èœããŸããããã¹ãã¯ããã©ã¡ãŒã¿ãŒãå€æŽãããå Žåã¯åŸã§èå¥ã§ããŸããã
NUnitã«ã¯ãããã»ã¹éã§äžå®å®ãªãã©ã¡ãŒã¿ãŒãæã€ãã¹ããèå¥ããããã«äœ¿çšã§ããç¬èªã®å éšIDã·ã¹ãã ããããŸããããã®IDã·ã¹ãã ã¯ãã¹ãçæã·ãŒã±ã³ã¹ã«åºã¥ããŠããŸãïŒã€ãŸããå¢åã§ãïŒã ãã®ãããªã·ã¹ãã ã¯ããã¹ãã¢ã»ã³ããªã®è€æ°ã®ããŒãžã§ã³ã«ããã£ãŠãã¹ãç¶æ ã管çããå¿ èŠããããã¹ãã©ã³ããŒã¯äœ¿çšã§ããŸããããŠãŒã¶ãŒãæ°ãããã¹ããäœæãããšããã¹ãŠã®IDã®é åºãçããããŒã¿ãå±éºãªã»ã©èª€è§£ãæãå¯èœæ§ãããããã§ãã ã NUnitéçºè ã¯ããã®ã·ãŒã±ã³ã¹ããŒã¹ã®ã·ã¹ãã ããããã¹ãå±æ§èªäœããçæãããIDã«ç§»è¡ããããšã«é¢å¿ã瀺ããŠããŸããããã¯ãXunitãè¡ãæ¹æ³ãšäŒŒãŠããŸãïŒäžå®å®ãªãã©ã¡ãŒã¿ãŒã§ã¯æ©èœããªãå¯èœæ§ããããŸãïŒã
ãããã®åé¡ã解決ããæåã®æ¹æ³ã¯ãäžå®å®ãªãã©ã¡ãŒã¿ãŒã®äžè²«ããã·ãŒããå®è¡ããããšã§ãããšç§ã¯ä»ã§ãä¿¡ããŠããŸãã ãã¹ãã¯ç¹°ãè¿ãå¯èœã§äžè²«ããŠããå¿ èŠããããšããæŠå¿µã¯åžžã«ãããŸããããã¹ãããã¹ãŠã®å ¥åãå®å šã«ã©ã³ãã åããŠããå Žåããããéæããããšã¯å°é£ã§ãã å®éã«ã¯ãå®è¡ã®ããã«ã©ã³ãã ã«ã·ãŒããããããŒã¿ãçæãããã¹ãã¯ãã³ãŒããäŸçµŠãããããŒã¿ã«åºã¥ããŠç°ãªãåäœãããå¯èœæ§ããããããçæããããã³ã«ãŸã£ããæ°ãããã¹ãã«ãªããŸãã
3.10.0.20ã®ã€ã³ã¹ããŒã«ã§ãã®èšå®ãèŠã€ããããšãã§ããŸããã§ããã trueã«èšå®ããå¿ èŠãããã圱é¿ãåãããèšå®ã®å Žåããå€ãããã¹ãã®ã¿ãæ€èšãããšããæå³ã§ããïŒ ã©ããã§èŠéããŠããŸã£ããããããªãã-ç§ã¯ãã®è£œåã«å°ãæ £ããŠããŸããã
NCrunchã¡ãã¥ãŒã«ç§»åãã[ãšã³ãžã³ã¢ãŒãã®èšå®]ãéžæãããšãããã«ãªãã·ã§ã³ã衚瀺ãããŸãã ããã«ãªãå Žåã¯ãã¯ããã«å€ãããŒãžã§ã³ã®NCrunchã«ãã£ãŠå®è¡ããããœãªã¥ãŒã·ã§ã³ã䜿çšããŠããŠãã¬ã¬ã·ãŒãšã³ãžã³ã¢ãŒãã®ã¿ã衚瀺ãããŠããå¯èœæ§ããããŸãã ã©ããã«æ°ãããœãªã¥ãŒã·ã§ã³ãäœæããã ãã§ãããã解決ã§ããŸãã
@remcomulderãããŒïŒ 詳ãã説æããããšãããããŸãïŒ ç¢ºãã«ãå éšã«ã¯ããã€ãã®å€§ããªåé¡ããããããAutoFixtureïŒNUnitã¯çŸåšãµããŒããããŠããªããšèšãæ¹ãç°¡åã§ãð
ãããã®åé¡ã解決ããæåã®æ¹æ³ã¯ãäžå®å®ãªãã©ã¡ãŒã¿ãŒã®äžè²«ããã·ãŒããå®è¡ããããšã§ãããšç§ã¯ä»ã§ãä¿¡ããŠããŸãã
å®éããã®PRã§ã¯å°ãéãèãããããŸãã å®å®ããããã«ãã¹ãåãå€æŽããããšæããŸãã ããšãã°ã次ã®ãããªãã¹ããäžããããŸãã
[Test, StableNameAutoData]
public void Sample(int a, Data d1, DataWithToString d2, ISomeData d3)
{
Assert.IsTrue(true);
}
ãã¹ãåã¯æ¬¡ã®ããã«ãªããŸãã
NUnit3RunnerTest709.TestNameTester.Sample(auto<System.Int32>,auto<NUnit3RunnerTest709.Data>,auto<NUnit3RunnerTest709.DataWithToString>,auto<Castle.Proxies.ISomeDataProxy>)
ååã¯åæ€åº/å®è¡äžåžžã«åãã§ãããå®éã®åŒæ°å€ã¯æ¯åç°ãªããŸãã
NUnitã«é¢ããæ·±ãç¥èãããå Žåããã®ã¢ãããŒããã©ã®ããã«è©äŸ¡ããŸããïŒ ããã¯ããªãã®ããã«åããŸããïŒ ç¹å®ã®åŒæ°å€ã«ãã€ã³ãããã®ã§ã¯ãªããçè«åã䜿çšããããšãæåŸ ããŠããŸãã ãããã£ãŠããã¹ãåãå®å®ããŠããã°ãèå¥ã§ããã®ã§åé¡ã¯ãããŸããã ãããå®è£ ããåã«ç¢ºèªããŠããã ããŸããïŒ âºïž
ãã¹ãã¯ç¹°ãè¿ãå¯èœã§äžè²«ããŠããå¿ èŠããããšããæŠå¿µã¯åžžã«ãããŸããããã¹ãããã¹ãŠã®å ¥åãå®å šã«ã©ã³ãã åããŠããå Žåããããéæããããšã¯å°é£ã§ãã
ããããããã€ãå®å®ããã·ãŒãããµããŒãããŠãåãåŒæ°ã§ãã¹ããåçã§ããããã«ããäºå®ã§ãããçŸåšã¯ããããããªãé¢ããŠãããããçŸå®çã§ã¯ãããŸããðãããããŠãŒã¶ãŒã®ã¢ãµãŒã·ã§ã³ã¯åŸã§ç解ã§ããã»ã©æ£ç¢ºã§ãããšæåŸ ããŠããŸãäžéšã®ç¯å²ã§å ¥åãã©ã³ãã åãããå Žåã§ãããã¹ãã倱æããçç±ã
NUnitã«é¢ããæ·±ãç¥èãããå Žåããã®ã¢ãããŒããã©ã®ããã«è©äŸ¡ããŸããïŒ ããã¯ããªãã®ããã«åããŸããïŒ ç¹å®ã®åŒæ°å€ã«ãã€ã³ãããã®ã§ã¯ãªããçè«åã䜿çšããããšãæåŸ ããŠããŸãã ãããã£ãŠããã¹ãåãå®å®ããŠããã°ãèå¥ã§ããã®ã§åé¡ã¯ãããŸããã ãããå®è£ ããåã«ç¢ºèªããŠããã ããŸããïŒ âºïž
æ®å¿µãªãããNUnitã«é¢ããç§ã®ç¥èã¯æ·±ããã®ã§ã¯ãããŸãã:( NCrunchã¯åºæ¬çã«ãNUnitãè¿ãååãååŸããããã䜿çšããŠèå¥åãçæããŸãããããã£ãŠãçè«çã«ã¯ããœãªã¥ãŒã·ã§ã³ããã¹ãã®ç©çåãå€æŽ/å®å®åããéãã NUnit APIã«ãã£ãŠè¿ãããå Žåãããã§åé¡ãªãã¯ãã§ã
å°ãªããšãNCrunchã®å Žåã
泚æãã¹ãç¹ã¯ããŠãŒã¶ãŒãåã眲åã§è€æ°ã®ãã¹ããäœæããå¯èœæ§ãããããšã§ãã ååã®ãã©ã¡ãŒã¿ãŒãrawåã«åé€ãããŠããå Žåãããã¯ã¯ããã«å¯èœæ§ãé«ããªããŸãã ãããã®ã·ããªãªãç¥ã£ãŠããéãããããããšã©ãŒãªã©ã§ã³ãŒãã£ã³ã°ããŠããããæããšã©ãŸãããããšãã§ããŸãã
@remcomulderæŽæ°ããããã ãã«ããã®åé¡ãæçµçã«è§£æ±ºã§ããŸãã
äžã§èª¬æããããã«ãxUnitãã¬ãŒã ã¯ãŒã¯ã¯ãã€ãã£ãã§ãµããŒããããŠããŸãã ãã ããNUnitã®å Žåãæ®çºæ§ã®ååã䜿çšãããã¹ãããµããŒãããŠããªããããåé¡ã¯æ確ã§ã¯ãããŸããã§ããã
æè¿ãPRãããŒãžããNUnitã®å®å®ããååã®ãµããŒããè¿œå ããæ°ããããŒãžã§ã³ã®AutoFixtureïŒ v3.51.0
ïŒããªãªãŒã¹ããŸããã ä»ã®ãšããããŠãŒã¶ãŒåŽããã®æåã¢ã¯ã·ã§ã³ãå¿
èŠã§ãïŒãããåç
§ïŒããv4ã§ã¯ããã«äœ¿çšã§ããããã«ããŸãã
ãã¹ããããšãããäžèšã®ã¢ãããŒãã䜿çšããå ŽåãNCrunchã¯å€æŽããããã¹ãã®ã¿ãå®è¡ã§ããæ£ããæ©èœããããã«ãªããŸããã ããªãã®åŽããã®ããã€ãã®è¡åãå¿ èŠãã©ããã¯ããããŸããïŒäŸãã°ãã©ããã«ãããææžåããïŒã ãŸãããã®æ°æ©èœããã¹ãããŠãä»ã¯æ£åžžã«æ©èœãããã©ããããç¥ããããã ããã°åé¡ãããŸããã®ã§ãäŒæ©ããŠãã ããð
@zvirjaããã«ã€ããŠç§ãã«ãŒããããŠãããŠããããšãã ç§ã¯ãã®äœåã«ç°¡åãªãã¹ããããŸããããããŠããã¯ç§ã«ã¯ãã£ããããŠããããã«èŠããŸãã ãã¹ãåããã©ã³ãã ãªèŠçŽ ãåé€ããããšã§ãã©ã³ããŒã¯ã»ãã·ã§ã³å šäœã§äžè²«ããŠãã¹ããèå¥ã§ãããã¹ãŠãé 調ã«èŠããŸã:)
ãŠãŒã¶ãŒãµããŒãã®æéãç¯çŽã§ãããšæããŸãããç§ã«ã¯èãããããŸãã ç§ãã¡å šå¡ããœãããŠã§ã¢ã§èŠã€ããåé¡ã®1ã€ã¯ãå€ãã®äººãããŒã«ãæã«å ¥ããåã«ããã¥ã¡ã³ããèªãŸãªãããšã§ãã NUnitã§äžæã®ååã®åé¡ã解決ããæ¹æ³ã«ã€ããŠã¢ããã€ã¹ã§ããããã«ãªã£ãã®ã§äŸ¿å©ã§ãããæåã®ã¢ãããŒãã¯åžžã«åé¡ãèªåçã«è§£æ±ºããããšã§ãã
ããã©ã«ãã§ã¯ãAutoFixtureã¯VolatileNameTestMethodBuilderã䜿çšããããšã«æ³šæããŠãã ããã ç§ã¯ãããäžäœäºææ§ã®çç±ã§ãããšèªãããããè³¢æã§ããããšã«åæããŸãã ããããç°å¢å€æ°ã䜿çšããŠãã®ããã©ã«ãããªãŒããŒã©ã€ãã§ããããã«ããå Žåã¯ã©ããªãã§ããããã AutoFixtureã«VolatileNameTestMethodBuilderã䜿çšãããããã«ç°å¢å€æ°ïŒããšãã°ã 'AutoFixture.FixedTestNames' == '1'ïŒãæå®ã§ããã°ãã©ã³ããŒã¯ãŠãŒã¶ãŒãäœãããªããŠããã«ããŒãäºåã«æå®ã§ããŸãã ããã¯ãè€æ°ã®ã©ã³ããŒã䜿çšãã人ã ã«ãšã£ãŠãããŒãã¹ã«ãªããŸããã©ã³ããŒããšã«ç°ãªããã«ããŒãæé»çã«äœ¿çšãïŒåŽåãå¿ èŠãšããã«ïŒãäž¡æ¹ã®äžçãæ倧éã«æŽ»çšã§ããããã§ãã
ã©ãæããŸããïŒ
ç§ã¯ãã®äœåã«ç°¡åãªãã¹ããããŸããããããŠããã¯ç§ã«ã¯ãã£ããããŠããããã«èŠããŸãã
ãããïŒ ðãã¹ãŠãæ£åžžã«æ©èœããããã«ãªã£ãããããã®åé¡ã解決ã§ããããšãæå³ããŸãã ããã§ã®ãã¹ããšåå ã«æè¬ããŸãð¥
ã©ãæããŸããïŒ
ç§ã¯ãã¯ããã«åªãããããåçŽãªãœãªã¥ãŒã·ã§ã³ã«ãã©ãçãããšæããŸãã FixedNameTestMethodBuilder
ãv4ïŒæ¬¡ã®ã¡ãžã£ãŒãªãªãŒã¹ïŒã®ããã©ã«ãæŠç¥ã«ããŸããããã¯ãæ¥æãŸãã¯2ãæ以å
ã«ãªãªãŒã¹ãããŸãã é©åãªPRã¯ãã§ã«æ¿èªãããŠããã®ã§ãã³ãŒãã¯ããã«ãããŸãã ãããã£ãŠãç§ãã¡ã¯ããã«åé¡ãªãåäœãã誰ããæ®çºæ§ã®ãã¹ãåãå¿
èŠãšããå Žåã圌ã¯æåã§ãªããã€ã³ããçµæãæ確ã«ç解ããŸãã
åŸã§ãããªããææ¡ãããããªããšãããããšãã§ããŸã-ç°å¢å€æ°/ AppConfigãæ€æ»ããåãæ¿ãæŠç¥ãè¿œå ããŸããããããæ¬åœã«å¿ èŠãªå Žåã«ã®ã¿ãããè¡ãããšã奜ã¿ãŸãã
æçµçã«ã¯ãã¯ããã«åªããã·ã³ãã«ãªãœãªã¥ãŒã·ã§ã³ã«ãªã£ããšæããŸããFixedNameTestMethodBuilderãv4ïŒæ¬¡ã®ã¡ãžã£ãŒãªãªãŒã¹ïŒã®ããã©ã«ãæŠç¥ã«ããŸããããã¯ãæ¥æãŸãã¯2ãæ以å ã«ãªãªãŒã¹ãããŸãã
ããã¯ç§ã«ãšã£ãŠçŽ æŽãããåããããŸã:)ç§ã¯å¹žãã§ãïŒ ãã¹ãŠã®åªåã«æè¬ããŸãã
ãã£ãããðè¿ä¿¡ãšã³ã©ãã¬ãŒã·ã§ã³ãããããšãããããŸããð
äž¡åŽããã®ã¢ã¯ã·ã§ã³ã¯ãã以äžå¿ èŠãªãããããããéããŸãã
@remcomulder @zvirjaãã®è°è«ïŒåæ§ã®åé¡ãç解ããã®ã«åœ¹ç«ã¡ãŸããïŒãšãããã§ç€ºããç®èº«ã¯çŽ æŽãããã«éããŸããïŒ çŽ æŽããã補åãããããšãããããŸããã
æãåèã«ãªãã³ã¡ã³ã
@remcomulder @zvirjaãã®è°è«ïŒåæ§ã®åé¡ãç解ããã®ã«åœ¹ç«ã¡ãŸããïŒãšãããã§ç€ºããç®èº«ã¯çŽ æŽãããã«éããŸããïŒ çŽ æŽããã補åãããããšãããããŸããã