예제 #1
0
        public void Compare(ref IList <AnnotatedTest> annotatedTests, ref TraceTests instructor, ref TraceTests student, ref FeedbackDto feedback)
        {
            foreach (var coverage in instructor.TestCoverages)
            {
                var            annotation   = FindAnnotation(ref annotatedTests, coverage);
                var            studentTests = GetStudentTests(coverage, ref student);
                TestStatusEnum testStatus;
                if (!coverage.Pass)
                {
                    testStatus = TestStatusEnum.Failed;
                }
                else
                {
                    var studentCoverage = FindCoverage(coverage, ref student);
                    testStatus = studentCoverage == null ? TestStatusEnum.Uncovered : TestStatusEnum.Covered;
                }

                feedback.InstructorTests.Add(
                    new InstructorTestDto
                {
                    Name             = coverage.Test.TestName,
                    Concepts         = (annotation == null) ? new string[] { } : annotation.Concepts.ToArray(),
                    EquivalenceClass = (annotation == null) ? "NONE" : annotation.EquivalanceClass,
                    TestStatus       = testStatus,
                    StudentTests     = studentTests
                });
            }
        }
예제 #2
0
        public TestCoverage FindCoverage(TestCoverage coverage, ref TraceTests against)
        {
            foreach (var testCoverage in against.TestCoverages)
            {
                if (testCoverage.Pass != coverage.Pass)
                {
                    continue;
                }

                if (CompareModuleCoverages(testCoverage.ModuleCoverages,
                                           coverage.ModuleCoverages))
                {
                    return(testCoverage);
                }
            }
            return(null);
        }
예제 #3
0
        private bool CompareTraceTest(TraceTests expected, TraceTests actual)
        {
            if (expected.TestCoverages.Count != actual.TestCoverages.Count)
            {
                return(false);
            }

            for (int i = 0; i < expected.TestCoverages.Count; i++)
            {
                var expectedCoverage = expected.TestCoverages[i];
                var actualCoverage   = actual.TestCoverages[i];

                if (expectedCoverage.ModuleCoverages.Count != actualCoverage.ModuleCoverages.Count)
                {
                    return(false);
                }

                if (!Equals(expectedCoverage.Test, actualCoverage.Test))
                {
                    return(false);
                }

                if (expectedCoverage.Pass != actualCoverage.Pass)
                {
                    return(false);
                }

                for (int j = 0; j < expectedCoverage.ModuleCoverages.Count; j++)
                {
                    var expectedModule = expectedCoverage.ModuleCoverages[j];
                    var actualModule   = actualCoverage.ModuleCoverages[j];

                    if (expectedModule.ModuleName != actualModule.ModuleName)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
예제 #4
0
        public IList <StudentTestDto> GetStudentTests(TestCoverage instructor, ref TraceTests student)
        {
            var studentTests = new List <StudentTestDto>();
            var testStatus   = TestStatusEnum.Covered;

            foreach (var coverage in student.TestCoverages)
            {
                if (CompareModuleCoverages(instructor.ModuleCoverages, coverage.ModuleCoverages))
                {
                    studentTests.Add(
                        new StudentTestDto()
                    {
                        TestStatus = testStatus,
                        Name       = coverage.Test.TestName,
                        Passed     = coverage.Pass
                    });
                    testStatus = TestStatusEnum.Redundant;
                }
            }
            return(studentTests);
        }
예제 #5
0
        public void GetTestCoverageFromSingleFile_ShouldPass()
        {
            // Arrange
            var file     = Path.Combine(CurrentDirectory, "my_test.py");
            var coverDir = Path.Combine(CurrentDirectory, "CoverDir");

            Directory.CreateDirectory(coverDir);
            File.WriteAllText(file,
                              "def test_one():\r\n" +
                              "   assert 2 == 2\r\n" +
                              "def test_two():\r\n" +
                              "   assert \"d\" in \"abc\"");

            // Act
            var actual = Tracer.GetTestCoverage(CurrentDirectory,
                                                coverDir,
                                                new List <IndividualTest>()
            {
                new IndividualTest("my_test.py::test_one"),
                new IndividualTest("my_test.py::test_two"),
            },
                                                new List <ModuleName>()
            {
                new ModuleName()
                {
                    Name = "my_test.py"
                }
            });

            // Assert
            var expected = new TraceTests
            {
                TestCoverages = new List <TestCoverage>()
                {
                    new TestCoverage()
                    {
                        Test            = new IndividualTest("my_test.py::test_one"),
                        Pass            = true,
                        ModuleCoverages = new List <ModuleCoverage>()
                        {
                            new ModuleCoverage()
                            {
                                ModuleName = new ModuleName()
                                {
                                    Name = "my_test.py"
                                },
                                Contents = new[] { "" }
                            }
                        }
                    },
                    new TestCoverage()
                    {
                        Test            = new IndividualTest("my_test.py::test_two"),
                        Pass            = false,
                        ModuleCoverages = new List <ModuleCoverage>()
                        {
                            new ModuleCoverage()
                            {
                                ModuleName = new ModuleName()
                                {
                                    Name = "my_test.py"
                                },
                                Contents = new[] { "" }
                            }
                        }
                    }
                }
            };

            Assert.IsTrue(CompareTraceTest(expected, actual));
        }
예제 #6
0
        public List <Tuple <List <int>, string> > GetInstructorCoverage(List <IEnumerable <MethodMetaData> > methodMetaDatas, ref TraceTests instructor)
        {
            List <Tuple <List <int>, string> > list = new List <Tuple <List <int>, string> >();

            foreach (var method in methodMetaDatas)
            {
                foreach (var i in instructor.TestCoverages)
                {
                    var m = method.Where(x => x.TestName == i.Test.TestName);

                    if (m != null)
                    {
                        var returnVal = FindCoverage(m);

                        var names = list
                                    .Select(x => x.Item2);

                        if (!names.Contains(i.Test.TestName) && returnVal.Count() != 0)
                        {
                            list.Add(new Tuple <List <int>, string>(returnVal, i.Test.TestName));
                        }
                    }
                }
            }
            return(list);
        }
예제 #7
0
        public void Compare(ref IList <AnnotatedTest> annotatedTests, ref TraceTests instructor,
                            ref TraceTests student, ref FeedbackDto feedback, EngineWorkingDirectories workingDirectories)
        {
            studentDirectory    = workingDirectories.StudentDllPath;
            instructorDirectory = workingDirectories.InstructorDllPath;

            var InstructorMethodData = GetMethodMetaDatas(instructor.TestCoverages);
            var instCov           = GetInstructorCoverage(InstructorMethodData, ref instructor);
            var StudentMethodData = GetMethodMetaDatas(student.TestCoverages);

            foreach (var coverage in instructor.TestCoverages)
            {
                var annotation = FindAnnotation(ref annotatedTests, coverage);

                var studentTests = new List <StudentTestDto>();

                TestStatusEnum testStatus = TestStatusEnum.Redundant;
                if (!coverage.Pass)
                {
                    testStatus = TestStatusEnum.Failed;
                }
                else
                {
                    var testData = StudentMethodData
                                   .SelectMany(x => x
                                               .Where(y => y.TestName == coverage.Test.TestName));


                    var studentCoverage = FindCoverage(testData);
                    int count           = 0;

                    foreach (var test in instCov)
                    {
                        if (test.Item1.Count() == studentCoverage.Count())
                        {
                            var areEq = test.Item1.SequenceEqual(studentCoverage);


                            var instDto = feedback.InstructorTests.FirstOrDefault(x => x.Name == test.Item2);

                            if (instDto != null)
                            {
                                if (instDto.TestStatus == TestStatusEnum.Covered)
                                {
                                    studentTests.Add(
                                        new StudentTestDto()
                                    {
                                        TestStatus = TestStatusEnum.Redundant,
                                        Name       = coverage.Test.TestName,
                                        Passed     = coverage.Pass
                                    });
                                    testStatus = TestStatusEnum.Redundant;
                                }
                            }
                            else if (areEq && count == 0)
                            {
                                studentTests.Add(
                                    new StudentTestDto()
                                {
                                    TestStatus = TestStatusEnum.Covered,
                                    Name       = coverage.Test.TestName,
                                    Passed     = coverage.Pass
                                });
                                count++;
                                testStatus = TestStatusEnum.Covered;
                            }
                            else if (!areEq)
                            {
                                studentTests.Add(
                                    new StudentTestDto()
                                {
                                    TestStatus = TestStatusEnum.Uncovered,
                                    Name       = coverage.Test.TestName,
                                    Passed     = coverage.Pass
                                });
                                testStatus = TestStatusEnum.Uncovered;
                            }
                        }
                    }
                }

                foreach (var test in feedback.InstructorTests)
                {
                    if (test.StudentTests.Count() == 0)
                    {
                        test.TestStatus = TestStatusEnum.Uncovered;
                    }

                    if (test.StudentTests.Count() > 1)
                    {
                        test.TestStatus = TestStatusEnum.Redundant;
                        var t = test.StudentTests.ToArray().Where(x => x.Name == x.Name);
                        if (t.Count() == test.StudentTests.Count())
                        {
                            test.TestStatus = TestStatusEnum.Covered;
                        }
                    }
                }

                feedback.InstructorTests.Add(
                    new InstructorTestDto
                {
                    Name             = coverage.Test.TestName,
                    Concepts         = (annotation == null) ? new string[] { } : annotation.Concepts.ToArray(),
                    EquivalenceClass = (annotation == null) ? "NONE" : annotation.EquivalanceClass,
                    TestStatus       = testStatus,
                    StudentTests     = studentTests
                });
            }

            var coverageSession = GetTotalCoverage(workingDirectories);

            //OpenCover generates reports for the methods being tested themselves, so it will show double the data it should
            //on coverage percentage, and statements. It is possible this can be filtered out in OpenCover, but I am not sure
            //how to do it without completel excluding the actual coverage data
            feedback.NumberOfBranchesHit       = coverageSession.Summary.VisitedBranchPoints;
            feedback.NumberOfMissingStatements = (coverageSession.Summary.NumSequencePoints / 2) - coverageSession.Summary.VisitedSequencePoints;
            feedback.NumberOfStatements        = coverageSession.Summary.NumSequencePoints / 2;
            feedback.CoveragePercentage        = (double)coverageSession.Summary.BranchCoverage * 2;
        }