diff --git a/src/Tools/AI Test Toolkit/AITestSummary.xlsx b/src/Tools/AI Test Toolkit/AITestSummary.xlsx
new file mode 100644
index 0000000000..e938bfeb3b
Binary files /dev/null and b/src/Tools/AI Test Toolkit/AITestSummary.xlsx differ
diff --git a/src/Tools/AI Test Toolkit/src/AITTestContext.Codeunit.al b/src/Tools/AI Test Toolkit/src/AITTestContext.Codeunit.al
index dd68b22f82..59d2417505 100644
--- a/src/Tools/AI Test Toolkit/src/AITTestContext.Codeunit.al
+++ b/src/Tools/AI Test Toolkit/src/AITTestContext.Codeunit.al
@@ -123,6 +123,15 @@ codeunit 149044 "AIT Test Context"
AITTestContextImpl.SetTestMetric(TestMetric);
end;
+ ///
+ /// Sets the accuracy of the test.
+ ///
+ /// The accuracy as a decimal between 0 and 1.
+ procedure SetAccuracy(Accuracy: Decimal)
+ begin
+ AITTestContextImpl.SetAccuracy(Accuracy);
+ end;
+
var
AITTestContextImpl: Codeunit "AIT Test Context Impl.";
}
\ No newline at end of file
diff --git a/src/Tools/AI Test Toolkit/src/AITTestContextImpl.Codeunit.al b/src/Tools/AI Test Toolkit/src/AITTestContextImpl.Codeunit.al
index 1499ffb8df..ce0f1dc83c 100644
--- a/src/Tools/AI Test Toolkit/src/AITTestContextImpl.Codeunit.al
+++ b/src/Tools/AI Test Toolkit/src/AITTestContextImpl.Codeunit.al
@@ -18,9 +18,12 @@ codeunit 149043 "AIT Test Context Impl."
var
AITTestSuiteMgt: Codeunit "AIT Test Suite Mgt.";
GlobalTestOutputJson: Codeunit "Test Output Json";
+ GlobalAccuracy: Decimal;
CurrentTurn: Integer;
NumberOfTurns: Integer;
IsMultiTurn: Boolean;
+ AccuracySetManually: Boolean;
+ AccuracyErr: Label 'Accuracy must be between 0 and 1.';
AnswerTok: Label 'answer', Locked = true;
ContextTok: Label 'context', Locked = true;
GroundTruthTok: Label 'ground_truth', Locked = true;
@@ -146,6 +149,34 @@ codeunit 149043 "AIT Test Context Impl."
SetSuiteTestOutput(CurrentTestOutputJson.ToText());
end;
+ ///
+ /// Sets the accuracy of the test.
+ ///
+ /// The accuracy as a decimal between 0 and 1.
+ procedure SetAccuracy(Accuracy: Decimal)
+ begin
+ if (Accuracy < 0) or (Accuracy > 1) then
+ Error(AccuracyErr);
+
+ AccuracySetManually := true;
+ GlobalAccuracy := Accuracy;
+ end;
+
+ ///
+ /// Gets the accuracy of the test. Can only be retrieved if the accuracy of the test was already set manually.
+ ///
+ /// The accuracy as a decimal between 0 and 1.
+ /// True if it was possible to get the accuracy, false otherwise.
+ procedure GetAccuracy(var Accuracy: Decimal): Boolean
+ begin
+ if AccuracySetManually then begin
+ Accuracy := GlobalAccuracy;
+ exit(true);
+ end;
+
+ exit(false);
+ end;
+
///
/// Sets to next turn for multiturn testing.
///
@@ -155,7 +186,7 @@ codeunit 149043 "AIT Test Context Impl."
if not IsMultiTurn then
exit(false);
- if CurrentTurn + 1 > NumberOfTurns then
+ if CurrentTurn > NumberOfTurns then
exit(false);
CurrentTurn := CurrentTurn + 1;
@@ -164,7 +195,7 @@ codeunit 149043 "AIT Test Context Impl."
end;
///
- /// Gets the current turn for multiturn testing. Turns start from turn 0.
+ /// Gets the current turn for multiturn testing. Turns start from turn 1.
///
/// The current turn number.
procedure GetCurrentTurn(): Integer
@@ -172,6 +203,15 @@ codeunit 149043 "AIT Test Context Impl."
exit(CurrentTurn);
end;
+ ///
+ /// Gets the total number of turns for multiturn testing.
+ ///
+ /// The total number of turns for the line.
+ procedure GetNumberOfTurns(): Integer
+ begin
+ exit(NumberOfTurns);
+ end;
+
///
/// This method starts the scope of the Run Procedure scenario.
///
@@ -205,12 +245,16 @@ codeunit 149043 "AIT Test Context Impl."
TestInput: Codeunit "Test Input";
TurnsInputJson: Codeunit "Test Input Json";
begin
- CurrentTurn := 0;
+ AccuracySetManually := false;
+ GlobalAccuracy := 0;
+ CurrentTurn := 1;
GlobalTestOutputJson.Initialize();
TurnsInputJson := TestInput.GetTestInput().ElementExists(TurnsTok, IsMultiTurn);
if IsMultiTurn then
- NumberOfTurns := TurnsInputJson.GetElementCount() - 1;
+ NumberOfTurns := TurnsInputJson.GetElementCount()
+ else
+ NumberOfTurns := 1;
end;
///
@@ -223,7 +267,7 @@ codeunit 149043 "AIT Test Context Impl."
TestInput: Codeunit "Test Input";
begin
if IsMultiTurn then
- TestInputJson := TestInput.GetTestInput(TurnsTok).ElementAt(CurrentTurn).Element(ElementName)
+ TestInputJson := TestInput.GetTestInput(TurnsTok).ElementAt(CurrentTurn - 1).Element(ElementName)
else
TestInputJson := TestInput.GetTestInput(ElementName);
end;
diff --git a/src/Tools/AI Test Toolkit/src/AITTestRunIteration.Codeunit.al b/src/Tools/AI Test Toolkit/src/AITTestRunIteration.Codeunit.al
index 4565bd168a..6ff6678936 100644
--- a/src/Tools/AI Test Toolkit/src/AITTestRunIteration.Codeunit.al
+++ b/src/Tools/AI Test Toolkit/src/AITTestRunIteration.Codeunit.al
@@ -21,6 +21,9 @@ codeunit 149042 "AIT Test Run Iteration"
GlobalTestMethodLine: Record "Test Method Line";
NoOfInsertedLogEntries: Integer;
GlobalAITokenUsedByLastTestMethodLine: Integer;
+ GlobalNumberOfTurnsForLastTestMethodLine: Integer;
+ GlobalNumberOfTurnsPassedForLastTestMethodLine: Integer;
+ GlobalTestAccuracy: Decimal;
GlobalSessionAITokenUsed: Integer;
trigger OnRun()
@@ -124,6 +127,21 @@ codeunit 149042 "AIT Test Run Iteration"
exit(GlobalAITokenUsedByLastTestMethodLine);
end;
+ procedure GetNumberOfTurnsForLastTestMethodLine(): Integer
+ begin
+ exit(GlobalNumberOfTurnsForLastTestMethodLine);
+ end;
+
+ procedure GetNumberOfTurnsPassedForLastTestMethodLine(): Integer
+ begin
+ exit(GlobalNumberOfTurnsPassedForLastTestMethodLine);
+ end;
+
+ procedure GetAccuracyForLastTestMethodLine(): Decimal
+ begin
+ exit(GlobalTestAccuracy);
+ end;
+
[InternalEvent(false)]
procedure OnBeforeRunIteration(var AITTestSuite: Record "AIT Test Suite"; var AITTestMethodLine: Record "AIT Test Method Line")
begin
@@ -144,6 +162,14 @@ codeunit 149042 "AIT Test Run Iteration"
// Update AI Token Consumption
GlobalAITokenUsedByLastTestMethodLine := 0;
+
+ // Update Turns
+ GlobalNumberOfTurnsPassedForLastTestMethodLine := 0;
+ GlobalNumberOfTurnsForLastTestMethodLine := 1;
+
+ // Update Test Accuracy
+ GlobalTestAccuracy := 0;
+
GlobalSessionAITokenUsed := AOAIToken.GetTotalServerSessionTokensConsumed();
AITContextCU.StartRunProcedureScenario();
@@ -154,6 +180,7 @@ codeunit 149042 "AIT Test Run Iteration"
var
AITContextCU: Codeunit "AIT Test Context Impl.";
AOAIToken: Codeunit "AOAI Token";
+ Accuracy: Decimal;
begin
if ActiveAITTestSuite.Code = '' then
exit;
@@ -166,6 +193,19 @@ codeunit 149042 "AIT Test Run Iteration"
// Update AI Token Consumption
GlobalAITokenUsedByLastTestMethodLine := AOAIToken.GetTotalServerSessionTokensConsumed() - GlobalSessionAITokenUsed;
+ // Update Turns
+ GlobalNumberOfTurnsForLastTestMethodLine := AITContextCU.GetNumberOfTurns();
+ GlobalNumberOfTurnsPassedForLastTestMethodLine := AITContextCU.GetCurrentTurn();
+
+ if not IsSuccess then
+ GlobalNumberOfTurnsPassedForLastTestMethodLine -= 1;
+
+ // Update Test Accuracy
+ if AITContextCU.GetAccuracy(Accuracy) then
+ GlobalTestAccuracy := Accuracy
+ else
+ GlobalTestAccuracy := GlobalNumberOfTurnsPassedForLastTestMethodLine / GlobalNumberOfTurnsForLastTestMethodLine;
+
AITContextCU.EndRunProcedureScenario(CurrentTestMethodLine, IsSuccess);
Commit();
end;
diff --git a/src/Tools/AI Test Toolkit/src/Logs/AITLogEntries.Page.al b/src/Tools/AI Test Toolkit/src/Logs/AITLogEntries.Page.al
index 123d63634e..d385fafb3e 100644
--- a/src/Tools/AI Test Toolkit/src/Logs/AITLogEntries.Page.al
+++ b/src/Tools/AI Test Toolkit/src/Logs/AITLogEntries.Page.al
@@ -68,6 +68,23 @@ page 149033 "AIT Log Entries"
{
StyleExpr = StatusStyleExpr;
}
+ field(Accuracy; Rec."Test Method Line Accuracy")
+ {
+ }
+ field("No. of Turns Passed"; Rec."No. of Turns Passed")
+ {
+ Visible = false;
+ }
+ field("No. of Turns"; Rec."No. of Turns")
+ {
+ Visible = false;
+ }
+ field(TurnsText; TurnsText)
+ {
+ StyleExpr = TurnsStyleExpr;
+ Caption = 'No. of Turns Passed';
+ ToolTip = 'Specifies the number of turns that passed out of the total number of turns.';
+ }
field("Orig. Status"; Rec."Original Status")
{
Visible = false;
@@ -253,6 +270,19 @@ page 149033 "AIT Log Entries"
Page.Run(Page::"AIT Test Data Compare", Rec);
end;
}
+ action("Download Test Summary")
+ {
+ Caption = 'Download Test Summary';
+ Image = Export;
+ ToolTip = 'Downloads a summary of the test results.';
+
+ trigger OnAction()
+ var
+ AITTestSuiteMgt: Codeunit "AIT Test Suite Mgt.";
+ begin
+ AITTestSuiteMgt.DownloadTestSummary(Rec);
+ end;
+ }
}
area(Promoted)
{
@@ -279,6 +309,9 @@ page 149033 "AIT Log Entries"
actionref("View Test Data_Promoted"; "View Test Data")
{
}
+ actionref("Export Results_Promoted"; "Download Test Summary")
+ {
+ }
}
}
}
@@ -287,20 +320,26 @@ page 149033 "AIT Log Entries"
ClickToShowLbl: Label 'Show data input';
DoYouWantToDeleteQst: Label 'Do you want to delete all entries within the filter?';
InputText: Text;
+ TurnsText: Text;
OutputText: Text;
ErrorMessage: Text;
ErrorCallStack: Text;
StatusStyleExpr: Text;
+ TurnsStyleExpr: Text;
TestRunDuration: Duration;
IsFilteredToErrors: Boolean;
ShowSensitiveData: Boolean;
trigger OnAfterGetRecord()
+ var
+ AITTestSuiteMgt: Codeunit "AIT Test Suite Mgt.";
begin
TestRunDuration := Rec."Duration (ms)";
+ TurnsText := AITTestSuiteMgt.GetTurnsAsText(Rec);
SetInputOutputDataFields();
SetErrorFields();
SetStatusStyleExpr();
+ SetTurnsStyleExpr();
end;
local procedure SetStatusStyleExpr()
@@ -315,6 +354,18 @@ page 149033 "AIT Log Entries"
end;
end;
+ local procedure SetTurnsStyleExpr()
+ begin
+ case Rec."No. of Turns Passed" of
+ Rec."No. of Turns":
+ TurnsStyleExpr := 'Favorable';
+ 0:
+ TurnsStyleExpr := 'Unfavorable';
+ else
+ TurnsStyleExpr := 'Ambiguous';
+ end;
+ end;
+
local procedure SetErrorFields()
begin
ErrorMessage := '';
diff --git a/src/Tools/AI Test Toolkit/src/Logs/AITLogEntry.Table.al b/src/Tools/AI Test Toolkit/src/Logs/AITLogEntry.Table.al
index efe7955c0e..679b9cb89a 100644
--- a/src/Tools/AI Test Toolkit/src/Logs/AITLogEntry.Table.al
+++ b/src/Tools/AI Test Toolkit/src/Logs/AITLogEntry.Table.al
@@ -159,6 +159,21 @@ table 149034 "AIT Log Entry"
{
Caption = 'Output Data';
}
+ field(40; "No. of Turns"; Integer)
+ {
+ Caption = 'Total number of turns';
+ ToolTip = 'Specifies the total number of turns.';
+ }
+ field(41; "No. of Turns Passed"; Integer)
+ {
+ Caption = 'Number of turns passed';
+ ToolTip = 'Specifies the number of turns passed.';
+ }
+ field(45; "Test Method Line Accuracy"; Decimal)
+ {
+ Caption = 'Test Method Line Accuracy';
+ ToolTip = 'Specifies the accuracy of the test line. The accuracy is calculated as the percentage of turns that passed or can be set manually in the test.';
+ }
field(50; "Tokens Consumed"; Integer)
{
Caption = 'Total Tokens Consumed';
diff --git a/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Page.al b/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Page.al
index 456639fbb0..071e3c5b15 100644
--- a/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Page.al
+++ b/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Page.al
@@ -121,6 +121,12 @@ page 149032 "AIT Run History"
AITLogEntryCodeunit.DrillDownFailedAITLogEntries(Rec."Test Suite Code", Rec."Line No. Filter", Rec.Version);
end;
}
+ field("Accuracy - By Version"; Rec."Accuracy Per Version")
+ {
+ Visible = ViewBy = ViewBy::Version;
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the version.';
+ }
field("Duration - By Version"; Rec."Total Duration (ms)")
{
Visible = ViewBy = ViewBy::Version;
@@ -161,6 +167,12 @@ page 149032 "AIT Run History"
AITLogEntryCodeunit.DrillDownFailedAITLogEntries(Rec."Test Suite Code", Rec."Line No. Filter", Rec.Tag);
end;
}
+ field("Accuracy - By Tag"; Rec."Accuracy - By Tag")
+ {
+ Visible = ViewBy = ViewBy::Tag;
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the tag.';
+ }
field("Duration - By Tag"; Rec."Total Duration (ms) - By Tag")
{
Visible = ViewBy = ViewBy::Tag;
diff --git a/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Table.al b/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Table.al
index 8194182f71..dfeb99366f 100644
--- a/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Table.al
+++ b/src/Tools/AI Test Toolkit/src/Logs/AITRunHistory.Table.al
@@ -73,6 +73,14 @@ table 149036 "AIT Run History"
FieldClass = FlowField;
CalcFormula = sum("AIT Log Entry"."Tokens Consumed" where("Test Suite Code" = field("Test Suite Code"), Version = field("Version"), "Test Method Line No." = field("Line No. Filter"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
}
+ field(14; "Accuracy Per Version"; Decimal)
+ {
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the version.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = average("AIT Log Entry"."Test Method Line Accuracy" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No. Filter"), Version = field("Version"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
field(20; "No. of Tests Executed - By Tag"; Integer)
{
Caption = 'No. of Tests Executed';
@@ -105,6 +113,14 @@ table 149036 "AIT Run History"
FieldClass = FlowField;
CalcFormula = sum("AIT Log Entry"."Tokens Consumed" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No. Filter"), Tag = field(Tag), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
}
+ field(24; "Accuracy - By Tag"; Decimal)
+ {
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the tag.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = average("AIT Log Entry"."Test Method Line Accuracy" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No. Filter"), Tag = field(Tag), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
}
keys
diff --git a/src/Tools/AI Test Toolkit/src/Logs/AITTestSummary.Report.al b/src/Tools/AI Test Toolkit/src/Logs/AITTestSummary.Report.al
new file mode 100644
index 0000000000..5c959e62fc
--- /dev/null
+++ b/src/Tools/AI Test Toolkit/src/Logs/AITTestSummary.Report.al
@@ -0,0 +1,72 @@
+// ------------------------------------------------------------------------------------------------
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+// ------------------------------------------------------------------------------------------------
+
+namespace System.TestTools.AITestToolkit;
+
+report 149030 "AIT Test Summary"
+{
+ Caption = 'AI Test Summary';
+ ApplicationArea = All;
+ UsageCategory = Tasks;
+ DefaultLayout = Excel;
+ ExcelLayout = 'AITestSummary.xlsx';
+
+ dataset
+ {
+ dataitem(Results; "AIT Log Entry")
+ {
+ RequestFilterFields = Version;
+ RequestFilterHeading = 'AI Test Log Entries';
+
+ column(CodeunitID; Results."Codeunit ID")
+ {
+ }
+ column(Name; Results."Codeunit Name")
+ {
+ }
+ column(TestName; Results."Procedure Name")
+ {
+ }
+ column(Status; Results.Status)
+ {
+ }
+ column(Accuracy; Results."Test Method Line Accuracy")
+ {
+ }
+ column(TurnsExecuted; Results."No. of Turns")
+ {
+ }
+ column(TurnsPassed; Results."No. of Turns Passed")
+ {
+ }
+ column(Input; Input)
+ {
+ }
+ column(Output; Output)
+ {
+ }
+ column(Error_Message; ErrorMessage)
+ {
+ }
+ column(Error; ErrorCallstack)
+ {
+ }
+
+ trigger OnAfterGetRecord()
+ begin
+ Input := Results.GetInputBlob();
+ Output := Results.GetOutputBlob();
+ ErrorMessage := Results.GetMessage();
+ ErrorCallstack := Results.GetErrorCallStack();
+ end;
+ }
+ }
+
+ var
+ Input: Text;
+ Output: Text;
+ ErrorMessage: Text;
+ ErrorCallstack: Text;
+}
\ No newline at end of file
diff --git a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLine.Table.al b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLine.Table.al
index 7f582e6ed4..91e3925e07 100644
--- a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLine.Table.al
+++ b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLine.Table.al
@@ -166,6 +166,30 @@ table 149032 "AIT Test Method Line"
FieldClass = FlowField;
CalcFormula = count("AIT Log Entry" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No."), Version = field("Base Version Filter")));
}
+ field(40; "No. of Turns"; Integer)
+ {
+ Caption = 'No. of Turns Executed';
+ ToolTip = 'Specifies the total number of turns for the test line.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = sum("AIT Log Entry"."No. of Turns" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No."), Version = field("Version Filter"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
+ field(41; "No. of Turns Passed"; Integer)
+ {
+ Caption = 'No. of Turns Passed';
+ ToolTip = 'Specifies the total number of passed turns for the test line.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = sum("AIT Log Entry"."No. of Turns Passed" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No."), Version = field("Version Filter"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
+ field(45; "Test Method Line Accuracy"; Decimal)
+ {
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the test line. The accuracy is calculated as the percentage of turns that passed or can be set manually by the test.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = average("AIT Log Entry"."Test Method Line Accuracy" where("Test Suite Code" = field("Test Suite Code"), "Test Method Line No." = field("Line No."), Version = field("Version Filter"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
field(101; "AL Test Suite"; Code[10])
{
Caption = 'AL Test Suite';
diff --git a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLines.Page.al b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLines.Page.al
index 7af836cbed..8df370b565 100644
--- a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLines.Page.al
+++ b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestMethodLines.Page.al
@@ -73,6 +73,52 @@ page 149034 "AIT Test Method Lines"
AITLogEntry.DrillDownFailedAITLogEntries(Rec."Test Suite Code", Rec."Line No.", AITTestSuite.Version);
end;
}
+ field(Accuracy; Rec."Test Method Line Accuracy")
+ {
+ }
+ field(TurnsText; TurnsText)
+ {
+ Visible = false;
+ Editable = false;
+ Caption = 'No. of Turns Passed';
+ ToolTip = 'Specifies the number of turns that passed out of the total number of turns.';
+
+ trigger OnDrillDown()
+ var
+ AITTestSuite: Record "AIT Test Suite";
+ AITLogEntry: Codeunit "AIT Log Entry";
+ begin
+ AITTestSuite.SetLoadFields("Base Version");
+ AITTestSuite.Get(Rec."Test Suite Code");
+ AITLogEntry.DrillDownFailedAITLogEntries(Rec."Test Suite Code", Rec."Line No.", AITTestSuite."Base Version");
+ end;
+ }
+ field("No. of Turns"; Rec."No. of Turns")
+ {
+ Visible = false;
+ }
+ field("No. of Turns Passed"; Rec."No. of Turns Passed")
+ {
+ Visible = false;
+ }
+ field("No. of Turns Failed"; Rec."No. of Turns" - Rec."No. of Turns Passed")
+ {
+ Visible = false;
+ Editable = false;
+ Caption = 'No. of Turns Failed';
+ ToolTip = 'Specifies the number of failed turns of the test line.';
+ Style = Unfavorable;
+
+ trigger OnDrillDown()
+ var
+ AITTestSuite: Record "AIT Test Suite";
+ AITLogEntry: Codeunit "AIT Log Entry";
+ begin
+ AITTestSuite.SetLoadFields("Base Version");
+ AITTestSuite.Get(Rec."Test Suite Code");
+ AITLogEntry.DrillDownFailedAITLogEntries(Rec."Test Suite Code", Rec."Line No.", AITTestSuite."Base Version");
+ end;
+ }
field("No. of Operations"; Rec."No. of Operations")
{
Visible = false;
@@ -196,6 +242,7 @@ page 149034 "AIT Test Method Lines"
AITTestSuite: Record "AIT Test Suite";
AITTestSuiteMgt: Codeunit "AIT Test Suite Mgt.";
NoLineSelectedErr: Label 'Select a line to compare';
+ TurnsText: Text;
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
begin
@@ -205,6 +252,11 @@ page 149034 "AIT Test Method Lines"
if AITTestSuite.Get(Rec."Test Suite Code") then;
end;
+ trigger OnAfterGetRecord()
+ begin
+ TurnsText := AITTestSuiteMgt.GetTurnsAsText(Rec);
+ end;
+
local procedure GetAvg(NumIterations: Integer; TotalNo: Integer): Integer
begin
if NumIterations = 0 then
diff --git a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Page.al b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Page.al
index 5096fadbbe..accb13e795 100644
--- a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Page.al
+++ b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Page.al
@@ -127,6 +127,9 @@ page 149031 "AIT Test Suite"
AITLogEntry.DrillDownFailedAITLogEntries(Rec.Code, 0, Rec.Version);
end;
}
+ field(Accuracy; Rec.Accuracy)
+ {
+ }
field("No. of Operations"; Rec."No. of Operations")
{
Visible = false;
@@ -257,6 +260,21 @@ page 149031 "AIT Test Suite"
end;
end;
}
+ action("Download Test Summary")
+ {
+ Caption = 'Download Test Summary';
+ Image = Export;
+ ToolTip = 'Downloads a summary of the test results.';
+
+ trigger OnAction()
+ var
+ AITLogEntry: Record "AIT Log Entry";
+ AITTestSuiteMgt: Codeunit "AIT Test Suite Mgt.";
+ begin
+ AITLogEntry.SetRange(Version, Rec.Version);
+ AITTestSuiteMgt.DownloadTestSummary(AITLogEntry);
+ end;
+ }
}
area(Navigation)
{
diff --git a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Table.al b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Table.al
index cf97553ad6..09e657cb00 100644
--- a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Table.al
+++ b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuite.Table.al
@@ -161,6 +161,14 @@ table 149030 "AIT Test Suite"
FieldClass = FlowField;
CalcFormula = sum("AIT Log Entry"."Tokens Consumed" where("Test Suite Code" = field("Code"), Version = field("Version"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
}
+ field(25; Accuracy; Decimal)
+ {
+ Caption = 'Accuracy';
+ ToolTip = 'Specifies the average accuracy of the test suite. The accuracy is calculated as the percentage of turns that passed or can be set manually by the test.';
+ Editable = false;
+ FieldClass = FlowField;
+ CalcFormula = average("AIT Log Entry"."Test Method Line Accuracy" where("Test Suite Code" = field("Code"), Version = field("Version"), Operation = const('Run Procedure'), "Procedure Name" = filter(<> '')));
+ }
field(50; "Test Runner Id"; Integer)
{
Caption = 'Test Runner Id';
diff --git a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuiteMgt.Codeunit.al b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuiteMgt.Codeunit.al
index d25d95fdb9..ce190c04e1 100644
--- a/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuiteMgt.Codeunit.al
+++ b/src/Tools/AI Test Toolkit/src/TestSuite/AITTestSuiteMgt.Codeunit.al
@@ -28,6 +28,10 @@ codeunit 149034 "AIT Test Suite Mgt."
CannotRunMultipleSuitesInParallelErr: Label 'There is already a test run in progress. You need to wait for it to finish or cancel it before starting a new test run.';
FeatureNameLbl: Label 'AI Test Toolkit', Locked = true;
LineNoFilterLbl: Label 'Codeunit %1 "%2" (Input: %3)', Locked = true;
+ TurnsLbl: Label '%1/%2', Comment = '%1 - No. of turns that passed, %2 - Total no. of turns';
+ EmptyLogEntriesErr: Label 'Cannot download test summary as there is no log entries within the filter.';
+ DownloadResultsLbl: Label 'Download Test Summary';
+ SummaryFileNameLbl: Label '%1_Test_Summary.xlsx', Locked = true;
ConfirmCancelQst: Label 'This action will mark the run as Cancelled. Are you sure you want to continue?';
procedure StartAITSuite(Iterations: Integer; var AITTestSuite: Record "AIT Test Suite")
@@ -355,6 +359,9 @@ codeunit 149034 "AIT Test Suite Mgt."
AITLogEntry."Procedure Name" := CurrentTestMethodLine.Function;
AITLogEntry."Tokens Consumed" := AITTestRunIteration.GetAITokenUsedByLastTestMethodLine();
+ AITLogEntry."No. of Turns" := AITTestRunIteration.GetNumberOfTurnsForLastTestMethodLine();
+ AITLogEntry."No. of Turns Passed" := AITTestRunIteration.GetNumberOfTurnsPassedForLastTestMethodLine();
+ AITLogEntry."Test Method Line Accuracy" := AITTestRunIteration.GetAccuracyForLastTestMethodLine();
AITLogEntry.Insert(true);
Commit();
@@ -371,6 +378,17 @@ codeunit 149034 "AIT Test Suite Mgt."
TelemetryCustomDimensions.Add('TotalDurationInMs', Format(TotalDurationInMs));
end;
+ internal procedure GetTurnsAsText(var AITTestMethodLine: Record "AIT Test Method Line"): Text
+ begin
+ AITTestMethodLine.CalcFields("No. of Turns Passed", "No. of Turns");
+ exit(StrSubstNo(TurnsLbl, AITTestMethodLine."No. of Turns Passed", AITTestMethodLine."No. of Turns"));
+ end;
+
+ internal procedure GetTurnsAsText(var AITLogEntry: Record "AIT Log Entry"): Text
+ begin
+ exit(StrSubstNo(TurnsLbl, AITLogEntry."No. of Turns Passed", AITLogEntry."No. of Turns"));
+ end;
+
internal procedure GetAvgDuration(AITTestMethodLine: Record "AIT Test Method Line"): Integer
begin
if AITTestMethodLine."No. of Tests Executed" = 0 then
@@ -440,6 +458,27 @@ codeunit 149034 "AIT Test Suite Mgt."
exit(FeatureNameLbl);
end;
+ internal procedure DownloadTestSummary(var AITLogEntries: Record "AIT Log Entry")
+ var
+ AITResults: Report "AIT Test Summary";
+ ResultsTempBlob: Codeunit "Temp Blob";
+ ResultsOutStream: OutStream;
+ ResultsInStream: InStream;
+ FilenameTxt: Text;
+ begin
+ if not AITLogEntries.FindFirst() then
+ Error(EmptyLogEntriesErr);
+
+ ResultsTempBlob.CreateOutStream(ResultsOutStream);
+
+ AITResults.SetTableView(AITLogEntries);
+ AITResults.SaveAs('', ReportFormat::Excel, ResultsOutStream);
+
+ FilenameTxt := StrSubstNo(SummaryFileNameLbl, AITLogEntries."Test Suite Code");
+ ResultsTempBlob.CreateInStream(ResultsInStream);
+ DownloadFromStream(ResultsInStream, DownloadResultsLbl, '', 'xlsx', FilenameTxt);
+ end;
+
[EventSubscriber(ObjectType::Table, Database::"AIT Test Suite", OnBeforeDeleteEvent, '', false, false)]
local procedure DeleteLinesOnDeleteAITTestSuite(var Rec: Record "AIT Test Suite"; RunTrigger: Boolean)
var