コード例 #1
0
ファイル: Discoverer.cs プロジェクト: leijiancd/fixie
        public IReadOnlyList<MethodGroup> DiscoverTestMethodGroups(Assembly assembly)
        {
            RunContext.Set(options);
            var conventions = new ConventionDiscoverer(assembly).GetConventions();

            var discoveredTestMethodGroups = new List<MethodGroup>();

            foreach (var convention in conventions)
            {
                var classDiscoverer = new ClassDiscoverer(convention);
                var candidateTypes = assembly.GetTypes();
                var testClasses = classDiscoverer.TestClasses(candidateTypes);

                var methodDiscoverer = new MethodDiscoverer(convention);
                foreach (var testClass in testClasses)
                {
                    var distinctMethodGroups = new Dictionary<string, MethodGroup>();

                    foreach (var testMethod in methodDiscoverer.TestMethods(testClass))
                    {
                        var methodGroup = new MethodGroup(testMethod);

                        distinctMethodGroups[methodGroup.FullName] = methodGroup;
                    }

                    discoveredTestMethodGroups.AddRange(distinctMethodGroups.Values);
                }
            }

            return discoveredTestMethodGroups;
        }
コード例 #2
0
        public IReadOnlyList <MethodGroup> DiscoverTestMethodGroups(Assembly assembly)
        {
            RunContext.Set(options);
            var conventions = new ConventionDiscoverer(assembly).GetConventions();

            var discoveredTestMethodGroups = new List <MethodGroup>();

            foreach (var convention in conventions)
            {
                var classDiscoverer = new ClassDiscoverer(convention);
                var candidateTypes  = assembly.GetTypes();
                var testClasses     = classDiscoverer.TestClasses(candidateTypes);

                var methodDiscoverer = new MethodDiscoverer(convention);
                foreach (var testClass in testClasses)
                {
                    var distinctMethodGroups = new Dictionary <string, MethodGroup>();

                    foreach (var testMethod in methodDiscoverer.TestMethods(testClass))
                    {
                        var methodGroup = new MethodGroup(testMethod);

                        distinctMethodGroups[methodGroup.FullName] = methodGroup;
                    }

                    discoveredTestMethodGroups.AddRange(distinctMethodGroups.Values);
                }
            }

            return(discoveredTestMethodGroups);
        }
コード例 #3
0
ファイル: Discoverer.cs プロジェクト: mslot/fixie
        public void DiscoverMethods(Assembly assembly)
        {
            var discovery = new BehaviorDiscoverer(assembly, customArguments).GetDiscovery();

            try
            {
                var classDiscoverer = new ClassDiscoverer(discovery);
                var candidateTypes  = assembly.GetTypes();
                var testClasses     = classDiscoverer.TestClasses(candidateTypes);

                var methodDiscoverer = new MethodDiscoverer(discovery);
                foreach (var testClass in testClasses)
                {
                    foreach (var testMethod in methodDiscoverer.TestMethods(testClass))
                    {
                        bus.Publish(new MethodDiscovered(testMethod));
                    }
                }
            }
            finally
            {
                discovery.Dispose();
            }
        }
コード例 #4
0
ファイル: ClassRunner.cs プロジェクト: mslot/fixie
        public ExecutionSummary Run(Type testClass, bool isOnlyTestClass)
        {
            var methods = methodDiscoverer.TestMethods(testClass);

            var summary = new ExecutionSummary();

            if (!methods.Any())
            {
                return(summary);
            }

            Start(testClass);

            var classStopwatch = Stopwatch.StartNew();

            var orderedMethods = OrderedMethods(methods, summary);

            bool classLifecycleFailed       = false;
            bool runCasesInvokedByLifecycle = false;

            try
            {
                Action <Action <Case> > runCases = caseLifecycle =>
                {
                    runCasesInvokedByLifecycle = true;

                    foreach (var @case in YieldCases(orderedMethods, summary))
                    {
                        Start(@case);

                        Exception caseLifecycleException = null;

                        string consoleOutput;
                        using (var console = new RedirectedConsole())
                        {
                            var caseStopwatch = Stopwatch.StartNew();

                            try
                            {
                                caseLifecycle(@case);
                            }
                            catch (Exception exception)
                            {
                                caseLifecycleException = exception;
                            }

                            caseStopwatch.Stop();

                            @case.Duration += caseStopwatch.Elapsed;

                            consoleOutput = console.Output;

                            @case.Output += consoleOutput;
                        }

                        Console.Write(consoleOutput);

                        var caseHasNormalResult = @case.State == CaseState.Failed || @case.State == CaseState.Passed;
                        var caseLifecycleFailed = caseLifecycleException != null;

                        if (caseHasNormalResult)
                        {
                            if (@case.State == CaseState.Failed)
                            {
                                Fail(@case, summary);
                            }
                            else if (!caseLifecycleFailed)
                            {
                                Pass(@case, summary);
                            }
                        }

                        if (caseLifecycleFailed)
                        {
                            Fail(new Case(@case, caseLifecycleException), summary);
                        }
                        else if (!caseHasNormalResult)
                        {
                            Skip(@case, summary);
                        }
                    }
                };

                var runContext = isOnlyTestClass && methods.Count == 1
                    ? new TestClass(testClass, runCases, methods.Single())
                    : new TestClass(testClass, runCases);

                execution.Execute(runContext);
            }
            catch (Exception exception)
            {
                classLifecycleFailed = true;
                foreach (var method in orderedMethods)
                {
                    Fail(method, exception, summary);
                }
            }

            if (!runCasesInvokedByLifecycle && !classLifecycleFailed)
            {
                //No cases ran, and we didn't already emit a general
                //failure for each method, so emit a general skip for
                //each method.
                foreach (var method in orderedMethods)
                {
                    var @case = new Case(method);
                    Skip(@case, summary);
                }
            }

            classStopwatch.Stop();
            Complete(testClass, summary, classStopwatch.Elapsed);

            return(summary);
        }
コード例 #5
0
ファイル: ClassRunner.cs プロジェクト: vgrigoriu/fixie
        public ClassResult Run(Type testClass)
        {
            var methods = methodDiscoverer.TestMethods(testClass);

            var cases = new List <Case>();
            var parameterGenerationFailures = new List <Case>();

            foreach (var method in methods)
            {
                try
                {
                    bool methodHasParameterizedCase = false;

                    foreach (var parameters in Parameters(method))
                    {
                        methodHasParameterizedCase = true;
                        cases.Add(new Case(method, parameters));
                    }

                    if (!methodHasParameterizedCase)
                    {
                        cases.Add(new Case(method));
                    }
                }
                catch (Exception parameterGenerationException)
                {
                    var @case = new Case(method);
                    @case.Fail(parameterGenerationException);
                    parameterGenerationFailures.Add(@case);
                }
            }

            var casesBySkipState = cases.ToLookup(SkipCase);
            var casesToSkip      = casesBySkipState[true].ToArray();
            var casesToExecute   = casesBySkipState[false].ToArray();

            var classResult = new ClassResult(testClass.FullName);

            if (casesToSkip.Any())
            {
                TryOrderCases(casesToSkip);

                foreach (var @case in casesToSkip)
                {
                    classResult.Add(Skip(@case));
                }
            }

            if (casesToExecute.Any())
            {
                if (TryOrderCases(casesToExecute))
                {
                    Run(testClass, casesToExecute);
                }

                foreach (var @case in casesToExecute)
                {
                    classResult.Add(@case.Exceptions.Any() ? Fail(@case) : Pass(@case));
                }
            }

            if (parameterGenerationFailures.Any())
            {
                var casesToFailWithoutRunning = parameterGenerationFailures.ToArray();

                TryOrderCases(casesToFailWithoutRunning);

                foreach (var caseToFailWithoutRunning in casesToFailWithoutRunning)
                {
                    classResult.Add(Fail(caseToFailWithoutRunning));
                }
            }

            return(classResult);
        }
コード例 #6
0
        public ClassResult Run(Type testClass)
        {
            var methods = methodDiscoverer.TestMethods(testClass);

            var cases = new List <Case>();
            var parameterGenerationFailures = new List <Case>();

            foreach (var method in methods)
            {
                try
                {
                    bool methodHasParameterizedCase = false;

                    foreach (var parameters in Parameters(method))
                    {
                        methodHasParameterizedCase = true;
                        cases.Add(new Case(method, parameters));
                    }

                    if (!methodHasParameterizedCase)
                    {
                        cases.Add(new Case(method));
                    }
                }
                catch (Exception parameterGenerationException)
                {
                    var @case = new Case(method);
                    @case.Fail(parameterGenerationException);
                    parameterGenerationFailures.Add(@case);
                }
            }

            var casesToSkipList    = new List <KeyValuePair <Case, string> >();
            var casesToExecuteList = new List <Case>();

            foreach (var @case in cases)
            {
                string reason;
                if (SkipCase(@case, out reason))
                {
                    casesToSkipList.Add(new KeyValuePair <Case, string>(@case, reason));
                }
                else
                {
                    casesToExecuteList.Add(@case);
                }
            }

            var casesToSkip    = casesToSkipList.Select(x => x.Key).ToArray();
            var casesToExecute = casesToExecuteList.ToArray();

            var classResult = new ClassResult(testClass.FullName);

            if (casesToSkip.Any())
            {
                TryOrderCases(casesToSkip);

                foreach (var @case in casesToSkip)
                {
                    classResult.Add(Skip(@case, casesToSkipList.Single(x => x.Key == @case).Value));
                }
            }

            if (casesToExecute.Any())
            {
                if (TryOrderCases(casesToExecute))
                {
                    Run(testClass, casesToExecute);
                }

                foreach (var @case in casesToExecute)
                {
                    classResult.Add(@case.Exceptions.Any() ? Fail(@case) : Pass(@case));
                }
            }

            if (parameterGenerationFailures.Any())
            {
                var casesToFailWithoutRunning = parameterGenerationFailures.ToArray();

                TryOrderCases(casesToFailWithoutRunning);

                foreach (var caseToFailWithoutRunning in casesToFailWithoutRunning)
                {
                    classResult.Add(Fail(caseToFailWithoutRunning));
                }
            }

            return(classResult);
        }
コード例 #7
0
ファイル: ClassRunner.cs プロジェクト: najeraz/fixie
        public ClassResult Run(Type testClass)
        {
            var methods = methodDiscoverer.TestMethods(testClass);

            var cases = new List <Case>();

            foreach (var method in methods)
            {
                try
                {
                    bool generatedInputParameters = false;

                    foreach (var parameters in Parameters(method))
                    {
                        generatedInputParameters = true;
                        cases.Add(new Case(method, parameters));
                    }

                    if (!generatedInputParameters)
                    {
                        if (method.GetParameters().Length > 0)
                        {
                            throw new Exception("This test case has declared parameters, but no parameter values have been provided to it.");
                        }

                        cases.Add(new Case(method));
                    }
                }
                catch (Exception parameterGenerationException)
                {
                    var @case = new Case(method);
                    @case.Fail(parameterGenerationException);
                    cases.Add(@case);
                }
            }

            var orderedCases = cases.ToArray();

            try
            {
                orderCases(orderedCases);
            }
            catch (Exception exception)
            {
                // When an exception is thrown attempting to sort an array,
                // the behavior is undefined, so at this point orderedCases
                // is no longer reliable and needs to be fixed. The best we
                // can do is go with the original order.
                orderedCases = cases.ToArray();

                foreach (var @case in cases)
                {
                    @case.Fail(exception);
                }
            }

            var classResult = new ClassResult(testClass.FullName);

            var casesToExecute = new List <Case>();

            foreach (var @case in orderedCases)
            {
                if (@case.Exceptions.Any())
                {
                    classResult.Add(Fail(@case));
                }
                else
                {
                    string reason;
                    bool   skipCase;

                    try
                    {
                        skipCase = SkipCase(@case, out reason);
                    }
                    catch (Exception exception)
                    {
                        @case.Fail(exception);
                        classResult.Add(Fail(@case));
                        continue;
                    }

                    if (skipCase)
                    {
                        classResult.Add(Skip(@case, reason));
                    }
                    else
                    {
                        casesToExecute.Add(@case);
                    }
                }
            }

            if (casesToExecute.Any())
            {
                Run(testClass, casesToExecute);

                foreach (var @case in casesToExecute)
                {
                    classResult.Add(@case.Exceptions.Any() ? Fail(@case) : Pass(@case));
                }
            }

            return(classResult);
        }