From 8901d054b150fc2fa3dc32f168b69f020cb5a437 Mon Sep 17 00:00:00 2001 From: Javier <10879637+javiertuya@users.noreply.github.com> Date: Sun, 4 Aug 2024 17:46:29 +0200 Subject: [PATCH] Refactor test html reports --- .../Test4giis.Qacover.Model/TestReport.cs | 120 +++++----------- net/resources/qacover-report/all-by-class.txt | 16 +++ .../qacover-report/all-keys-by-run-order.txt | 42 +++--- .../test4giis/qacover/model/TestReport.java | 130 +++++------------- .../resources/qacover-report/all-by-class.txt | 16 +++ .../qacover-report/all-data-by-run-order.txt | 12 +- .../qacover-report/all-keys-by-run-order.txt | 42 +++--- ...4giis.qacoverapp.AppSimpleJdbc3Errors.html | 8 +- 8 files changed, 155 insertions(+), 231 deletions(-) create mode 100644 net/resources/qacover-report/all-by-class.txt create mode 100644 qacover-core/src/test/resources/qacover-report/all-by-class.txt diff --git a/net/QACoverTest/Translated/Test4giis.Qacover.Model/TestReport.cs b/net/QACoverTest/Translated/Test4giis.Qacover.Model/TestReport.cs index c70e7a7..d4fb651 100644 --- a/net/QACoverTest/Translated/Test4giis.Qacover.Model/TestReport.cs +++ b/net/QACoverTest/Translated/Test4giis.Qacover.Model/TestReport.cs @@ -19,10 +19,17 @@ namespace Test4giis.Qacover.Model { /// /// Report generation: - /// Configures QACover to send rules and reports under a different folder (qacover-report) - /// Uses the thest included in the sample (qacoversample) as the application under test - /// Tests the readers in a more integrated way + /// As the application to be reported, uses three classes that include the + /// most relevant situations that have been unit tested before, + /// but here, the goal is to check everything in an integrated way. /// + /// + /// Report generation: + /// As the application to be reported, uses three classes that include the + /// most relevant situations that have been unit tested before, + /// but here, the goal is to check everything in an integrated way. + /// Configures QACover to send rules and reports under a different folder (qacover-report). + /// public class TestReport : Base { private string rulesPath = FileUtil.GetPath(Parameters.GetProjectRoot(), Parameters.GetReportSubdir(), "qacover-report", "rules"); @@ -35,6 +42,7 @@ public class TestReport : Base private SoftVisualAssert va; + // All comparisons are made over expected and actual files // Each platform (java/net) has its own set of expected values for the reports /// [NUnit.Framework.SetUp] @@ -48,7 +56,7 @@ public override void SetUp() [NUnit.Framework.TearDown] public override void TearDown() { - va.AssertAll("diff-aggregated-" + NUnit.Framework.TestContext.CurrentContext.Test.Name + ".html"); + va.AssertAll("diff-IntegratedTestReaderAndReport.html"); base.TearDown(); } @@ -75,32 +83,18 @@ private void Reset(bool inferQueryParameters, bool boundaries) [Test] public virtual void TestReports() { - // Runs the application with partial comparison (readers and reports) at each Reset(); new StoreService(options).DropRules().DropLast(); // clean start + // Runs the application mock classes to generate the rules RunReports1OfTestStore(); - AssertReaderByClass(0); - new ReportManager().Run(rulesPath, outPath); - AssertReports(reportAppPackage, "AppSimpleJdbc.html"); - Reset(); RunReports2OfTestEvaluation(); - AssertReaderByClass(1); - new ReportManager().Run(rulesPath, outPath); - AssertReports(reportAppPackage, "AppSimpleJdbc2.html"); - // Excludes Jdk 1.4 because uses H2 with different message errors - if (!new Variability().IsJava4()) - { - Reset(); - RunReports3OfTestError(); - AssertReaderByClass(2); - new ReportManager().Run(rulesPath, outPath); - AssertReports(reportAppPackage, "AppSimpleJdbc3Errors.html"); - } + RunReports3OfTestError(); + // Before the report, checks the results of the readers AssertReaderByClassAll(); - AssertReaderByRunOrderAll(); - // Repeats the evaluation and report generation with a full check - Reset(); + AssertReaderKeysByRunOrderAll(); + AssertReaderDataByRunOrderAll(); + // Generate and test the html report new ReportManager().Run(Configuration.GetInstance().GetStoreRulesLocation(), Configuration.GetInstance().GetStoreReportsLocation()); string indexContent = FileUtil.FileRead(outPath, "index.html"); FileUtil.FileWrite(outPath, "index.html", indexContent); @@ -183,37 +177,37 @@ private void RunReports3OfTestError() app.Close(); } - private string[] expectedCols = new string[] { "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc qcount=6,qerror=0,count=17,dead=7,error=0\n" + " queryDifferentSingleLine\n" + " queryDifferentSingleLine\n" + " queryEqualDifferentLine\n" + " queryEqualDifferentLine\n" + " queryNoParameters1Condition\n" - + " queryNoParameters2Condition", "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc2 qcount=2,qerror=0,count=6,dead=4,error=0\n" + " queryNoParameters1Condition\n" + " queryNoParameters2Condition", "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc3Errors qcount=4,qerror=1,count=8,dead=1,error=2\n" - + " query0Errors\n" + " query1ErrorAtQuery\n" + " query1ErrorAtRule\n" + " queryMultipleErrors" }; - - private string expectedAllSummary = "CoverageCollection: qcount=12,qerror=1,count=31,dead=12,error=2"; - - // Exptected values from the CoverageReaders - private void AssertReaderByClass(int expectedIndex) + private void AssertReaderByClassAll() { CoverageCollection ccol = new CoverageReader(Configuration.GetInstance().GetStoreRulesLocation()).GetByClass(); - QueryCollection qcol = ccol.Get(expectedIndex); - va.AssertEquals(expectedCols[expectedIndex].ToLower(), qcol.ToString(true, false, false).ToLower(), "at assertReaderByClass(" + expectedIndex + ")"); + string expected = ccol.ToString(true, false, false); + FileUtil.FileWrite(outPath, "all-by-class.txt", ccol.ToString(true, false, false)); + string actual = FileUtil.FileRead(bmkPath, "all-by-class.txt"); + va.AssertEquals(expected.Replace("\r", string.Empty), actual.Replace("\r", string.Empty), "at assertReaderByClassAll()"); } - // lowercase for netcore compatibility - private void AssertReaderByClassAll() + private void AssertReaderKeysByRunOrderAll() { - CoverageCollection ccol = new CoverageReader(Configuration.GetInstance().GetStoreRulesLocation()).GetByClass(); - va.AssertEquals((expectedAllSummary + "\n" + expectedCols[0] + "\n" + expectedCols[1] + "\n" + expectedCols[2]).ToLower(), ccol.ToString(true, false, false).ToLower(), "at assertReaderByClassAll()"); + StringBuilder allKeys = new StringBuilder(); + CoverageReader cr = new CoverageReader(Configuration.GetInstance().GetStoreRulesLocation()); + QueryCollection cc = cr.GetByRunOrder(); + for (int i = 0; i < cc.Size(); i++) + { + allKeys.Append(cc.Get(i).GetKey() + "|" + cc.Get(i).GetParametersXml() + "\n"); + } + FileUtil.FileWrite(outPath, "all-keys-by-run-order.txt", allKeys.ToString()); + string actualKeys = FileUtil.FileRead(outPath, "all-keys-by-run-order.txt"); + string expectedKeys = FileUtil.FileRead(bmkPath, "all-keys-by-run-order.txt"); + va.AssertEquals(expectedKeys.Replace("\r", string.Empty), actualKeys.Replace("\r", string.Empty), "at assertReaderByRunOrderAll(), check expectedKeys"); } - // first checks all keys and then the data from CoverageReader - private void AssertReaderByRunOrderAll() + private void AssertReaderDataByRunOrderAll() { - StringBuilder allKeys = new StringBuilder(); StringBuilder allData = new StringBuilder(); CoverageReader cr = new CoverageReader(Configuration.GetInstance().GetStoreRulesLocation()); QueryCollection cc = cr.GetByRunOrder(); for (int i = 0; i < cc.Size(); i++) { - allKeys.Append(cc.Get(i).GetKey() + "\n"); allData.Append("*** " + cc.Get(i).GetKey() + "\n"); allData.Append("sql: " + cc.Get(i).GetModel().GetSql() + "\n"); allData.Append("parameters: " + cc.Get(i).GetParametersXml() + "\n"); @@ -227,23 +221,9 @@ private void AssertReaderByRunOrderAll() allData.Append("schema: " + new TdSchemaXmlSerializer().Serialize(schema.GetModel()) + "\n"); } } - FileUtil.FileWrite(outPath, "all-keys-by-run-order.txt", allKeys.ToString()); FileUtil.FileWrite(outPath, "all-data-by-run-order.txt", allData.ToString()); - string actualKeys = FileUtil.FileRead(outPath, "all-keys-by-run-order.txt"); string actualData = FileUtil.FileRead(outPath, "all-data-by-run-order.txt"); - string expectedKeys = FileUtil.FileRead(bmkPath, "all-keys-by-run-order.txt"); string expectedData = FileUtil.FileRead(bmkPath, "all-data-by-run-order.txt"); - if (new Variability().IsNetCore()) - { - expectedKeys = ReplaceExpectedStrings(expectedKeys); - expectedData = ReplaceExpectedStrings(expectedData); - } - // line numbers as ### to allow comparison - expectedKeys = JavaCs.ReplaceRegex(expectedKeys, "\\.\\d+\\.", ".###."); - expectedData = JavaCs.ReplaceRegex(expectedData, "\\.\\d+\\.", ".###."); - actualKeys = JavaCs.ReplaceRegex(actualKeys, "\\.\\d+\\.", ".###."); - actualData = JavaCs.ReplaceRegex(actualData, "\\.\\d+\\.", ".###."); - va.AssertEquals(expectedKeys.Replace("\r", string.Empty), actualKeys.Replace("\r", string.Empty), "at assertReaderByRunOrderAll(), check expectedKeys"); va.AssertEquals(expectedData.Replace("\r", string.Empty), actualData.Replace("\r", string.Empty), "at assertReaderByRunOrderAll(), check expectedData"); } @@ -252,10 +232,6 @@ private void AssertReports(string packageName, string className) { string expected = FileUtil.FileRead(bmkPath, packageName.ToLower() + className); string actual = FileUtil.FileRead(outPath, packageName + className); - if (new Variability().IsNetCore()) - { - expected = ReplaceExpectedStrings(expected); - } expected = ReprocessReportForCompare(expected); actual = ReprocessReportForCompare(actual); va.AssertEquals(expected, actual, "at className: " + className); @@ -263,32 +239,10 @@ private void AssertReports(string packageName, string className) public static string ReprocessReportForCompare(string content) { - content = JavaCs.ReplaceRegex(content, ":\\d+<", ":###<"); + // to compare using a fixed date and version number content = JavaCs.ReplaceRegex(content, "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}", "yyyy-MM-ddThh:mm:ss.SSS"); content = JavaCs.ReplaceRegex(content, "\\[version .*\\]", "[version x.y.z]"); - content = JavaCs.ReplaceRegex(content, "Error at Get query table names: ApiException.*<\\/span>", "Error at Get query table names: ApiException<\\/span>"); return content.Replace("\r", string.Empty); } - - private string ReplaceExpectedStrings(string expected) - { - expected = expected.Replace("test4giis.qacoverapp", "Test4in2test.Qacoverapp"); - expected = expected.Replace("queryDifferentSingleLine", "QueryDifferentSingleLine"); - expected = expected.Replace("queryEqualDifferentLine", "QueryEqualDifferentLine"); - expected = expected.Replace("queryNoParameters1Condition", "QueryNoParameters1Condition"); - expected = expected.Replace("queryNoParameters2Condition", "QueryNoParameters2Condition"); - expected = expected.Replace("query0Errors", "Query0Errors"); - expected = expected.Replace("query1ErrorAtQuery", "Query1ErrorAtQuery"); - expected = expected.Replace("query1ErrorAtRule", "Query1ErrorAtRule"); - expected = expected.Replace("queryMultipleErrors", "QueryMultipleErrors"); - expected = expected.Replace("java.lang.RuntimeException", "System.Exception"); - expected = expected.Replace("org.sqlite.SQLiteException", "Microsoft.Data.Sqlite.SqliteException"); - expected = expected.Replace("giis.qacover.portable", "Giis.Qacover.Portable"); - expected = expected.Replace("HTTP/1.1 404 Not Found", "NotFound"); - expected = expected.Replace("[SQLITE_ERROR] SQL error or missing database (near \"selectar\": syntax error)", "SQLite Error 1: 'near \"selectar\": syntax error'."); - expected = expected.Replace("[SQLITE_ERROR] SQL error or missing database (no such table: notable)", "SQLite Error 1: 'no such table: notable'."); - expected = expected.Replace("Giis.Tdrules.Openapi.Invoker.ApiException", "Giis.Tdrules.Openapi.Client.ApiException"); - return expected; - } } } diff --git a/net/resources/qacover-report/all-by-class.txt b/net/resources/qacover-report/all-by-class.txt new file mode 100644 index 0000000..a7fb598 --- /dev/null +++ b/net/resources/qacover-report/all-by-class.txt @@ -0,0 +1,16 @@ +CoverageCollection: qcount=12,qerror=1,count=31,dead=12,error=2 +QueryCollection: Test4giis.Qacoverapp.AppSimpleJdbc qcount=6,qerror=0,count=17,dead=7,error=0 + QueryDifferentSingleLine + QueryDifferentSingleLine + QueryEqualDifferentLine + QueryEqualDifferentLine + QueryNoParameters1Condition + QueryNoParameters2Condition +QueryCollection: Test4giis.Qacoverapp.AppSimpleJdbc2 qcount=2,qerror=0,count=6,dead=4,error=0 + QueryNoParameters1Condition + QueryNoParameters2Condition +QueryCollection: Test4giis.Qacoverapp.AppSimpleJdbc3Errors qcount=4,qerror=1,count=8,dead=1,error=2 + Query0Errors + Query1ErrorAtQuery + Query1ErrorAtRule + QueryMultipleErrors \ No newline at end of file diff --git a/net/resources/qacover-report/all-keys-by-run-order.txt b/net/resources/qacover-report/all-keys-by-run-order.txt index c3a08de..20d23ab 100644 --- a/net/resources/qacover-report/all-keys-by-run-order.txt +++ b/net/resources/qacover-report/all-keys-by-run-order.txt @@ -1,21 +1,21 @@ -Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters1Condition.29.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.51.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.51.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.56.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.72.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.75.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.72.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.75.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters2Condition.28.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query0Errors.22.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query1ErrorAtQuery.28.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query1ErrorAtRule.34.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters2Condition.35.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryNoParameters1Condition.29.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.51.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.51.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryDifferentSingleLine.56.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.72.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.75.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.72.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +Test4giis.Qacoverapp.AppSimpleJdbc.QueryEqualDifferentLine.75.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters2Condition.28.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +Test4giis.Qacoverapp.AppSimpleJdbc2.QueryNoParameters1Condition.22.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query0Errors.22.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query1ErrorAtQuery.28.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.Query1ErrorAtRule.34.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +Test4giis.Qacoverapp.AppSimpleJdbc3Errors.QueryMultipleErrors.40.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| diff --git a/qacover-core/src/test/java/test4giis/qacover/model/TestReport.java b/qacover-core/src/test/java/test4giis/qacover/model/TestReport.java index bd22d70..da84ffb 100644 --- a/qacover-core/src/test/java/test4giis/qacover/model/TestReport.java +++ b/qacover-core/src/test/java/test4giis/qacover/model/TestReport.java @@ -31,11 +31,13 @@ /** * Report generation: - * Configures QACover to send rules and reports under a different folder (qacover-report) - * Uses the thest included in the sample (qacoversample) as the application under test - * Tests the readers in a more integrated way + * As the application to be reported, uses three classes that include the + * most relevant situations that have been unit tested before, + * but here, the goal is to check everything in an integrated way. + * Configures QACover to send rules and reports under a different folder (qacover-report). */ public class TestReport extends Base { + // All comparisons are made over expected and actual files private String rulesPath = FileUtil.getPath(Parameters.getProjectRoot(), Parameters.getReportSubdir(), "qacover-report", "rules"); private String outPath = FileUtil.getPath(Parameters.getProjectRoot(), Parameters.getReportSubdir(), "qacover-report", "reports"); // Each platform (java/net) has its own set of expected values for the reports @@ -53,7 +55,7 @@ public void setUp() throws SQLException { @After public void tearDown() throws SQLException { - va.assertAll("diff-aggregated-" + testName.getMethodName() + ".html"); + va.assertAll("diff-IntegratedTestReaderAndReport.html"); super.tearDown(); } @@ -73,35 +75,20 @@ private void reset(boolean inferQueryParameters, boolean boundaries) { @Test public void testReports() throws SQLException { - // Runs the application with partial comparison (readers and reports) at each reset(); new StoreService(options).dropRules().dropLast(); // clean start + + // Runs the application mock classes to generate the rules runReports1OfTestStore(); - assertReaderByClass(0); - new ReportManager().run(rulesPath, outPath); - assertReports(reportAppPackage, "AppSimpleJdbc.html"); - - reset(); runReports2OfTestEvaluation(); - assertReaderByClass(1); - new ReportManager().run(rulesPath, outPath); - assertReports(reportAppPackage, "AppSimpleJdbc2.html"); - - // Excludes Jdk 1.4 because uses H2 with different message errors - if (!new Variability().isJava4()) { - reset(); - runReports3OfTestError(); - assertReaderByClass(2); - new ReportManager().run(rulesPath, outPath); - assertReports(reportAppPackage, "AppSimpleJdbc3Errors.html"); - } + runReports3OfTestError(); + // Before the report, checks the results of the readers assertReaderByClassAll(); - - assertReaderByRunOrderAll(); + assertReaderKeysByRunOrderAll(); + assertReaderDataByRunOrderAll(); - // Repeats the evaluation and report generation with a full check - reset(); + // Generate and test the html report new ReportManager().run(Configuration.getInstance().getStoreRulesLocation(), Configuration.getInstance().getStoreReportsLocation()); String indexContent = FileUtil.fileRead(outPath, "index.html"); FileUtil.fileWrite(outPath, "index.html", indexContent); @@ -191,49 +178,33 @@ private void runReports3OfTestError() throws SQLException { app.close(); } - // Exptected values from the CoverageReaders - private String[] expectedCols = new String[] { - "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc qcount=6,qerror=0,count=17,dead=7,error=0\n" + - " queryDifferentSingleLine\n" + - " queryDifferentSingleLine\n" + - " queryEqualDifferentLine\n" + - " queryEqualDifferentLine\n" + - " queryNoParameters1Condition\n" + - " queryNoParameters2Condition", - "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc2 qcount=2,qerror=0,count=6,dead=4,error=0\n" + - " queryNoParameters1Condition\n" + - " queryNoParameters2Condition", - "QueryCollection: test4giis.qacoverapp.AppSimpleJdbc3Errors qcount=4,qerror=1,count=8,dead=1,error=2\n" + - " query0Errors\n" + - " query1ErrorAtQuery\n" + - " query1ErrorAtRule\n" + - " queryMultipleErrors" - }; - private String expectedAllSummary = "CoverageCollection: qcount=12,qerror=1,count=31,dead=12,error=2"; - - private void assertReaderByClass(int expectedIndex) { - CoverageCollection ccol = new CoverageReader(Configuration.getInstance().getStoreRulesLocation()).getByClass(); - QueryCollection qcol = ccol.get(expectedIndex); - va.assertEquals(expectedCols[expectedIndex].toLowerCase(), - qcol.toString(true, false, false).toLowerCase(), - "at assertReaderByClass(" + expectedIndex + ")"); // lowercase for netcore compatibility - } private void assertReaderByClassAll() { CoverageCollection ccol = new CoverageReader(Configuration.getInstance().getStoreRulesLocation()).getByClass(); - va.assertEquals((expectedAllSummary + "\n" + expectedCols[0] + "\n" + expectedCols[1] + "\n" + expectedCols[2]) - .toLowerCase(), - ccol.toString(true, false, false).toLowerCase(), - "at assertReaderByClassAll()"); + String expected = ccol.toString(true, false, false); + FileUtil.fileWrite(outPath, "all-by-class.txt", ccol.toString(true, false, false)); + + String actual = FileUtil.fileRead(bmkPath, "all-by-class.txt"); + va.assertEquals(expected.replace("\r", ""), actual.replace("\r", ""), "at assertReaderByClassAll()"); } - // first checks all keys and then the data from CoverageReader - private void assertReaderByRunOrderAll() { + private void assertReaderKeysByRunOrderAll() { StringBuilder allKeys = new StringBuilder(); + CoverageReader cr = new CoverageReader(Configuration.getInstance().getStoreRulesLocation()); + QueryCollection cc = cr.getByRunOrder(); + for (int i = 0; i < cc.size(); i++) + allKeys.append(cc.get(i).getKey() + "|" + cc.get(i).getParametersXml() + "\n"); + FileUtil.fileWrite(outPath, "all-keys-by-run-order.txt", allKeys.toString()); + + String actualKeys = FileUtil.fileRead(outPath, "all-keys-by-run-order.txt"); + String expectedKeys = FileUtil.fileRead(bmkPath, "all-keys-by-run-order.txt"); + va.assertEquals(expectedKeys.replace("\r", ""), actualKeys.replace("\r", ""), "at assertReaderByRunOrderAll(), check expectedKeys"); + } + + private void assertReaderDataByRunOrderAll() { StringBuilder allData = new StringBuilder(); CoverageReader cr = new CoverageReader(Configuration.getInstance().getStoreRulesLocation()); QueryCollection cc = cr.getByRunOrder(); for (int i = 0; i < cc.size(); i++) { - allKeys.append(cc.get(i).getKey() + "\n"); allData.append("*** " + cc.get(i).getKey() + "\n"); allData.append("sql: " + cc.get(i).getModel().getSql() + "\n"); allData.append("parameters: " + cc.get(i).getParametersXml() + "\n"); @@ -244,23 +215,10 @@ private void assertReaderByRunOrderAll() { allData.append("schema: " + new TdSchemaXmlSerializer().serialize(schema.getModel()) + "\n"); } } - FileUtil.fileWrite(outPath, "all-keys-by-run-order.txt", allKeys.toString()); FileUtil.fileWrite(outPath, "all-data-by-run-order.txt", allData.toString()); - String actualKeys = FileUtil.fileRead(outPath, "all-keys-by-run-order.txt"); String actualData = FileUtil.fileRead(outPath, "all-data-by-run-order.txt"); - String expectedKeys = FileUtil.fileRead(bmkPath, "all-keys-by-run-order.txt"); String expectedData = FileUtil.fileRead(bmkPath, "all-data-by-run-order.txt"); - if (new Variability().isNetCore()) { - expectedKeys = replaceExpectedStrings(expectedKeys); - expectedData = replaceExpectedStrings(expectedData); - } - // line numbers as ### to allow comparison - expectedKeys = JavaCs.replaceRegex(expectedKeys, "\\.\\d+\\.", ".###."); - expectedData = JavaCs.replaceRegex(expectedData, "\\.\\d+\\.", ".###."); - actualKeys = JavaCs.replaceRegex(actualKeys, "\\.\\d+\\.", ".###."); - actualData = JavaCs.replaceRegex(actualData, "\\.\\d+\\.", ".###."); - va.assertEquals(expectedKeys.replace("\r", ""), actualKeys.replace("\r", ""), "at assertReaderByRunOrderAll(), check expectedKeys"); va.assertEquals(expectedData.replace("\r", ""), actualData.replace("\r", ""), "at assertReaderByRunOrderAll(), check expectedData"); } @@ -268,37 +226,17 @@ private void assertReaderByRunOrderAll() { private void assertReports(String packageName, String className) { String expected = FileUtil.fileRead(bmkPath, packageName.toLowerCase() + className); String actual = FileUtil.fileRead(outPath, packageName + className); - if (new Variability().isNetCore()) - expected = replaceExpectedStrings(expected); + expected = reprocessReportForCompare(expected); actual = reprocessReportForCompare(actual); va.assertEquals(expected, actual, "at className: " + className); } + public static String reprocessReportForCompare(String content) { - content = JavaCs.replaceRegex(content, ":\\d+<", ":###<"); + // to compare using a fixed date and version number content = JavaCs.replaceRegex(content, "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}", "yyyy-MM-ddThh:mm:ss.SSS"); content = JavaCs.replaceRegex(content, "\\[version .*\\]", "[version x.y.z]"); - content = JavaCs.replaceRegex(content, "Error at Get query table names: ApiException.*<\\/span>", "Error at Get query table names: ApiException<\\/span>"); return content.replace("\r", ""); } - private String replaceExpectedStrings(String expected) { - expected = expected.replace("test4giis.qacoverapp", "Test4in2test.Qacoverapp"); - expected = expected.replace("queryDifferentSingleLine", "QueryDifferentSingleLine"); - expected = expected.replace("queryEqualDifferentLine", "QueryEqualDifferentLine"); - expected = expected.replace("queryNoParameters1Condition", "QueryNoParameters1Condition"); - expected = expected.replace("queryNoParameters2Condition", "QueryNoParameters2Condition"); - expected = expected.replace("query0Errors", "Query0Errors"); - expected = expected.replace("query1ErrorAtQuery", "Query1ErrorAtQuery"); - expected = expected.replace("query1ErrorAtRule", "Query1ErrorAtRule"); - expected = expected.replace("queryMultipleErrors", "QueryMultipleErrors"); - expected = expected.replace("java.lang.RuntimeException", "System.Exception"); - expected = expected.replace("org.sqlite.SQLiteException", "Microsoft.Data.Sqlite.SqliteException"); - expected = expected.replace("giis.qacover.portable", "Giis.Qacover.Portable"); - expected = expected.replace("HTTP/1.1 404 Not Found", "NotFound"); - expected = expected.replace("[SQLITE_ERROR] SQL error or missing database (near \"selectar\": syntax error)", "SQLite Error 1: 'near \"selectar\": syntax error'."); - expected = expected.replace("[SQLITE_ERROR] SQL error or missing database (no such table: notable)", "SQLite Error 1: 'no such table: notable'."); - expected = expected.replace("Giis.Tdrules.Openapi.Invoker.ApiException", "Giis.Tdrules.Openapi.Client.ApiException"); - return expected; - } } diff --git a/qacover-core/src/test/resources/qacover-report/all-by-class.txt b/qacover-core/src/test/resources/qacover-report/all-by-class.txt new file mode 100644 index 0000000..18e218f --- /dev/null +++ b/qacover-core/src/test/resources/qacover-report/all-by-class.txt @@ -0,0 +1,16 @@ +CoverageCollection: qcount=12,qerror=1,count=31,dead=12,error=2 +QueryCollection: test4giis.qacoverapp.AppSimpleJdbc qcount=6,qerror=0,count=17,dead=7,error=0 + queryDifferentSingleLine + queryDifferentSingleLine + queryEqualDifferentLine + queryEqualDifferentLine + queryNoParameters1Condition + queryNoParameters2Condition +QueryCollection: test4giis.qacoverapp.AppSimpleJdbc2 qcount=2,qerror=0,count=6,dead=4,error=0 + queryNoParameters1Condition + queryNoParameters2Condition +QueryCollection: test4giis.qacoverapp.AppSimpleJdbc3Errors qcount=4,qerror=1,count=8,dead=1,error=2 + query0Errors + query1ErrorAtQuery + query1ErrorAtRule + queryMultipleErrors \ No newline at end of file diff --git a/qacover-core/src/test/resources/qacover-report/all-data-by-run-order.txt b/qacover-core/src/test/resources/qacover-report/all-data-by-run-order.txt index 4320e78..6b29e25 100644 --- a/qacover-core/src/test/resources/qacover-report/all-data-by-run-order.txt +++ b/qacover-core/src/test/resources/qacover-report/all-data-by-run-order.txt @@ -422,7 +422,7 @@ schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query0Errors.16.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query0Errors.14.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 sql: select id,num,text from test where num<9 parameters: rule0: 1STFF1.w.1.[WHERE num < 9] @@ -444,12 +444,12 @@ schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtQuery.19.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtQuery.17.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311 sql: select id,num,text from test where num<10 parameters: schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtRule.22.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtRule.20.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255 sql: select id,num,text from test where num < 11 parameters: rule0: 1SBB+F1.w.1.[WHERE num < 11] @@ -478,7 +478,7 @@ schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 sql: select id,num,text from test where num<9 parameters: rule0: 1SBB+F1.w.1.[WHERE num < 9] @@ -508,7 +508,7 @@ schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 sql: select id,num,text from test where num<9 parameters: rule0: 1SBB+F1.w.1.[WHERE num < 9] @@ -538,7 +538,7 @@ schema: -*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +*** test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 sql: select id,num,text from test where num<9 parameters: rule0: 1SBB+F1.w.1.[WHERE num < 9] diff --git a/qacover-core/src/test/resources/qacover-report/all-keys-by-run-order.txt b/qacover-core/src/test/resources/qacover-report/all-keys-by-run-order.txt index da24d67..333f951 100644 --- a/qacover-core/src/test/resources/qacover-report/all-keys-by-run-order.txt +++ b/qacover-core/src/test/resources/qacover-report/all-keys-by-run-order.txt @@ -1,21 +1,21 @@ -test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters1Condition.23.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731 -test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731 -test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.41.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.44.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.41.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.44.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354 -test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters2Condition.17.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80 -test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031 -test4giis.qacoverapp.AppSimpleJdbc3Errors.query0Errors.16.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtQuery.19.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311 -test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtRule.22.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255 -test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 -test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.25.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153 +test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters2Condition.26.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +test4giis.qacoverapp.AppSimpleJdbc.queryNoParameters1Condition.23.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731| +test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.c4869b5b7ec19955a2c6ead9c938b0a5d4c4927723fd515418b3bfcb631d3731| +test4giis.qacoverapp.AppSimpleJdbc.queryDifferentSingleLine.35.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.41.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.44.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.41.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +test4giis.qacoverapp.AppSimpleJdbc.queryEqualDifferentLine.44.e03a1fbcfe551f7b165fd9302db349ece39d1809bc9a5d6c64ff6ca9a5173354| +test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters2Condition.17.6af47aa3d7fda829fc88672c5bb64fbf9efea7f6f3416ee899789f2990b1ba80| +test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +test4giis.qacoverapp.AppSimpleJdbc2.queryNoParameters1Condition.14.2ad05b47f18cfd5166dc1feb6b547049794ba1edd0df35fee72c9fc252def031| +test4giis.qacoverapp.AppSimpleJdbc3Errors.query0Errors.14.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtQuery.17.7ab053d55b54c975de770640bed8e8ee65c54aec24d94b949b6b3fdc49a1d311| +test4giis.qacoverapp.AppSimpleJdbc3Errors.query1ErrorAtRule.20.cf89702f8478266da73089272b7d89c3812b3e236dbbe2b02949c2ca1bdd1255| +test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| +test4giis.qacoverapp.AppSimpleJdbc3Errors.queryMultipleErrors.23.5229f8eb53298d20f6959ec6cffcad93d5aa94a9af072386d353c31b08f75153| diff --git a/qacover-core/src/test/resources/qacover-report/test4giis.qacoverapp.AppSimpleJdbc3Errors.html b/qacover-core/src/test/resources/qacover-report/test4giis.qacoverapp.AppSimpleJdbc3Errors.html index 6c85baf..c5bdb49 100644 --- a/qacover-core/src/test/resources/qacover-report/test4giis.qacoverapp.AppSimpleJdbc3Errors.html +++ b/qacover-core/src/test/resources/qacover-report/test4giis.qacoverapp.AppSimpleJdbc3Errors.html @@ -19,7 +19,7 @@

test4giis.qacoverapp.AppSimpleJdbc3Errors

-
query0Errors:16 +query0Errors:14
50% (1/2) 1 run(s)
select id,num,text from test where num<9 @@ -42,7 +42,7 @@

test4giis.qacoverapp.AppSimpleJdbc3Errors

-
query1ErrorAtQuery:19 +query1ErrorAtQuery:17
(0/0) 0 run(s)
select id,num,text from test where num<10
Error at Get query table names: ApiException{code=0, responseHeaders=null, responseBody='null'} @@ -59,7 +59,7 @@

test4giis.qacoverapp.AppSimpleJdbc3Errors

-
query1ErrorAtRule:22 +query1ErrorAtRule:20
0% (0/3) 1 run(s) 1 rule(s) with error
select id,num,text from test where num < 11 @@ -85,7 +85,7 @@

test4giis.qacoverapp.AppSimpleJdbc3Errors

-
queryMultipleErrors:25 +queryMultipleErrors:23
0% (0/3) 3 run(s) 1 rule(s) with error
select id,num,text from test where num<9