AutomationToolsCore 2.4.3
dotnet add package AutomationToolsCore --version 2.4.3
NuGet\Install-Package AutomationToolsCore -Version 2.4.3
<PackageReference Include="AutomationToolsCore" Version="2.4.3" />
paket add AutomationToolsCore --version 2.4.3
#r "nuget: AutomationToolsCore, 2.4.3"
// Install AutomationToolsCore as a Cake Addin #addin nuget:?package=AutomationToolsCore&version=2.4.3 // Install AutomationToolsCore as a Cake Tool #tool nuget:?package=AutomationToolsCore&version=2.4.3
Alaska ITS QE Automation Tools
The information in this document is to provide an overview of the available functionality within this package. It was designed for Crew Tools API and UI Automation but can easily be applied to any automation portfolio.
Quick Links
What's New?
- Here you will find the latest updates.
Key Features
Below are the essential classes of this library, commonly used functions from those classes, and a brief explanation of their use cases. Please use these functions when ever possbile. It will save time in test writing.
Shared Tools
-
Automation Logger
- Shared Tools </br></br>
AddToLog()
Add a message to the log. This can be any information that needs to be logged. An enum can be passed to make it a warning message or error message, though the two below functions are preferred.
// Log test data AutomationLogger.AddToLog($"Testing using: {randomEvent}");
</br>
LogWarning()
Log a warning, this should not be used for validation logging.
AutomationLogger.LogWarning($"Class with Trip Identifier: {classInfo.TripIdentifier} may have been reset, no equivalent found in DB Scheduled class list");
</br>
LogError()
Log an error. This should be used for any condition that would indicate a test/feature failure.
AutomationLogger.LogError($"{eventDB} not found in DB");
</br>
GetPST()
Returns the current time in PST timezone, most applications need PST time, all logs are in PST time.
var currentDate = AutomationLogger.GetPST().ToString("yyyy-MM");
</br>
SetBaseURL()
This is used in the construction of an API controller in order to set the base URL of an API in the logger.
public CreamController(APIConfigs apiConfigs) : base(apiConfigs) { AutomationLogger.SetBaseURL(apiConfigs.BaseURL); AutomationLogger.AddToLog("Cream Controller created"); }
</br>
SetDBType()
This is used in the construction of a DB controller in order to set the type of database that's being used.
public CreamDB(string connectionString) { AutomationLogger.AddToLog("Opening Cream DB connection"); AutomationLogger.SetDBType("MS-SQL"); ConnectionString = connectionString; ModelGenerator = new SQLModelGenerator(); QueryFileName = "DatabaseQueryMapping"; }
</br>
ConfigureLogger()
This is a required setup function. Pass the name of the Application, the testing type (BVT, Smoke, etc.) and the environment (QA, Test, etc.).
public void Setup() { RandomizerTool = new AutomationRandomizerTools(); CreamHelper = new CreamHelper(); AutomationLogger.ConfigureLogger( appName: "Cream", testType: TestType.Functional, environment: TestContext.Parameters.Get("Env") ?? string.Empty); }
</br>
ReconfigureLogger()
This is used when comparing two different API environments. Example: (QA and Production) This is for logging clarity only.
// Reconfigure the logger for Production AutomationLogger.ReconfigureLogger();
// Reconfigure the logger for QA AutomationLogger.ReconfigureLogger("QA");
</br>
LogTestResult()
This is a required test completion function. Pass the name of the test function, true or false, and the Automation Core Driver object reference where appropriate (UI testing only).
finally { // Log test result AutomationLogger.LogTestResult(System.Reflection.MethodBase.GetCurrentMethod().Name, testPassed); // Assert test passed Assert.IsTrue(testPassed); }
</br>
TestConditionsNotMet()
This can be used to show that conditions for a test are not met. This should be used sparingly. An option message can be added to explain.
AutomationLogger.TestConditionsNotMet($"No data recovered from GetCrewInfo endpoint for FA with Id: {randomFA.GetValueByAttributeName("crewId")}");
</br>
NoErrorsPresent()
This is an essential function. API helper functions should return a boolean using this function.
return AutomationLogger.NoErrorsPresent();
</br>
CatchException()
This is an essential function. Will log any exception including an Inner Exception if one exists. Use with all test executions.
catch (Exception ex) { // Catch any unhandled exceptions that may occur AutomationLogger.CatchException(System.Reflection.MethodBase.GetCurrentMethod()!.Name, ex); }
</br>
LogDBQuery()
Log a database query. This facilites manual verification.
var sqlQuery = AutomationSQLTools.GetStoredQuery( filename: QueryFileName!, queryName: System.Reflection.MethodBase.GetCurrentMethod()!.Name); AutomationLogger.LogDBQuery(sqlQuery.Replace("@evtdtl_id", evtdtl_id));
</br>
LogValueMismatch()
This is an essential function. When two objects are not equal, pass the objects(two strings, two ints, a string and an int, etc.) and their sources (DB and API, QA and Production, etc.) and the column name to this for logging. This is a boiler plate function and will work with any object type.
if (!currentEvent.Reason!.StringsMatch(eventDB.Evt_code!)) { AutomationLogger.LogValueMismatch( object1: eventDB.Evt_code!, object2: currentEvent.Reason, source1: "Cream DB", source2: "Cream API", fieldName: "Event Code"); }
</br>
Randomizer Tool
- Shared Tools </br></br>
The Randomizer Tool is only psuedo random and not to be used for any kind of security or cryptograpic purposes.
GetRandomDate()
Gets a random date between the base date and today. Default base date is 1/1/2000. Base year, month, and day are optional variables. DateTime object will be in the PST timezone.
// Get Random Date to test var dateToTest = RandomizerTool.GetRandomDate().ToString("M-d-yyyy");
</br>
GetRandomFutureDate()
Gets a random date in the future. Optional variables can be supplied to adjust the range. The default range is 5 years. The default base date is current year + 1 on January 1st.
var startDate = AutomationRandomizerTools.GetRandomFutureDate(2, AutomationLogger.GetPST().AddYears(-1).Year).ToString("MM/dd/yyyy");
</br>
GetRandomDateInRange()
Returns a random date between two DateTime objects, two strings, or one of each. If a non-datetime string is provided, returns DateTime.MinValue.
// get current PST time var now = AutomationLogger.GetPST(); // get random start date up to 6 weeks prior var startDate = RandomizerTool!.GetRandomDateInRange(now.AddDays(-42), now); // get random end date up to 17 weeks later var endDate = RandomizerTool.GetRandomDateInRange(now, now.AddDays(7 * 17));
</br>
GetRandomString()
Creates a pseudo random string. Default length is 10 characters and numbers are inlcuded by default. Can include upper and lower case letters. This SHOULD NOT be used for any kind of security or crptography.
// create random meta data var metaData = new Dictionary<string, string> { { $"{RandomizerTool.GetRandomString(10, false)}", $"{RandomizerTool.GetRandomString(16, false)}" }, { $"{RandomizerTool.GetRandomString(10, false)}", $"{RandomizerTool.GetRandomString(16, false)}" } };
</br>
GetRandomTime() </br>
GetRandomObjectFromCollection()
This will select a random object from the supplied collection. Works with Lists and Arrays.
A string array can also be provided containing field names that must not be null when selecting a random entry.
// Fetch a random entry from the list var randomEvent = RandomizerTool!.GetRandomObjectFromCollection(events!);
</br>
GetRandomDoubleAsString() </br>
Extensions
IsNullOrEmpty()
- This function will return true if a string is empty, a collection is empty, or any object is null.
// Validate file exists in DB if (!documentData.IsNullOrEmpty())
DateFormat()
- This function takes in a string and will return a date string in the supplied format if the string is a valid DateTime string, otherwise, it returns an empty string or the original string.
// past month will only fetch data from DB and current will fetch from FTSA Prod api as well as Firefly DB if (Convert.ToDateTime(startDate.DateFormat("yyyy-MM")) >= Convert.ToDateTime(currentDate))
DatesMatch()
This function has four variants:
Compare two strings
Compare a DateTime object and a string
Compare a string and a DateTime object
Compare two DateTime objects
It will return true if both dates match, time is not checked by default but can be if desired.
if (!auth.Auth_last_modified_datetime!.DatesMatch(currentAPI.Auth_last_modified_datetime!)) { AutomationLogger.LogValueMismatch( object1: auth.Auth_last_modified_datetime!, object2: currentAPI.Auth_last_modified_datetime, source1: "Cream DB", source2: "Cream API", fieldName: "Auth_last_modified_datetime"); }
StringsMatch()
- This function will return true if two strings match. Case is not considered by default but can be if desired.
if (!auth.Auth_last_modified_by!.StringsMatch(currentAPI.Auth_last_modified_by!)) { AutomationLogger.LogValueMismatch( object1: auth.Auth_last_modified_by!, object2: currentAPI.Auth_last_modified_by, source1: "Cream DB", source2: "Cream API", fieldName: "Auth_last_modified_by"); }
StringifyDictionary()
- This function converts a Dictionary of type <string, string> into a JSON friendly string.
// convert the supplied meta data into a JSON friendly string var keyValues = Extensions.StringifyDictionary(metaData);
CombineDictionaries()
- This combines two Dictionaries into one. This has only been tested with <string, string> dictionaries.
// add to the current metadata Extensions.CombineDictionaries(requestSearch.DocumentMetadata, entries);
DictionariesMatch()
- This returns true if two dictionaries match completely. This has only been tested with <string, string> dictionaries.
CompareBools()
- Accepts any combination of booleans, ints, and string and returns true if they match.
if (!item.IsProtected.CompareBools(currentDocument.Is_protected)) { AutomationLogger.LogValueMismatch( object1: item.IsProtected, object2: currentDocument.Is_protected, source1: "Crew Files API", source2: "Crew Files DB", fieldName: "IsProtected"); }
Encryption
SQL Model Generator
The parameters are the model type and the SQL data reader.
Reader options:
SQLDataReader
DB2DataReader
OracleDataReader
Example usage:
connection.Open(); var reader = command.ExecuteReader(); while (reader.Read()) { getScheduledClassesDbData.Add(ModelGenerator.GenerateModel<ScheduledClassesDetailsDB>(reader)); } reader.Close();
This removes the need to set each variable within a model.
Example of code being replaced:
connection.Open(); var reader = command.ExecuteReader(); while (reader.Read()) { getScheduledClassesDbData.Add(new ScheduledClassesDetailsDB() { TripIdentifier = reader["TripIdentifier"].ToString().Trim(), Code = reader["training_code"].ToString().Trim(), StartTime = reader["training_default_starttime"].ToString().Trim(), EndTime = reader["training_default_endtime"].ToString().Trim(), StartDate = reader["training_startDate"].ToString().Trim(), EndDate = reader["training_endDate"].ToString().Trim(), Size = reader["training_classsize"].ToString().Trim(), Base = reader["training_base"].ToString().Trim(), BidPeriod = reader["bid_period"].ToString().Trim(), TrainingType = reader["training_code_subtype"].ToString().Trim(), Description = reader["training_code_name"].ToString().Trim(), Location = reader["training_classloc"].ToString().Trim(), }); } reader.Close();
- Note: This requires DB models to have string parameters only.
Automation SQL Tools
- placeholder
UI Only Tools
Automation Element Manager
- UI Only Tools TODO: List functions
Automation Page Manager
- UI Only Tools TODO: List functions
Automation Core Driver
- UI Only ToolsS TODO: List functions
Tag Categories
- Quick Links Tags are used to organize test execution. There are shared tags included in this package that should be included in all tests.
In the Visual Studio, tests are organized in a heirarchy.
{ApplicationName}.{API}.Tests
{ApplicationName}Tests.{Production, Regession, Migration, Smoke, Functional, or BVT}
{ApplicationName}Tests
{FunctionName}
Example:
Cream.API.Tests
CreamTests.BVT
CreamBVTTests
CreamGetPing()
- Shared Tags:
public const string All_E2E = "All_E2E";
public const string All_BVT = "All_BVT";
public const string All_Smoke = "All_Smoke";
public const string All_Functional = "All_Functional";
public const string All_Production = "All_Production";
public const string All_Migration = "All_Migration";
public const string All_Regression = "All_Regression";
public const string Internal_Tools = "Internal_Tools";
- Project Specfic Example (All projects should have each of these tags for consistency):
namespace Cream.API.Framework.Helpers
{
public class CreamCategory
{
public const string Cream_API_All = "Cream_API_All";
public const string Cream_API_BVT = "Cream_API_BVT";
public const string Cream_API_Smoke = "Cream_API_Smoke";
public const string Cream_API_Functional = "Cream_API_Functional";
public const string Cream_API_Production = "Cream_API_Production";
public const string Cream_API_Migration = "Cream_API_Migration";
public const string Cream_API_Regression = "Cream_API_Regression";
public const string Cream_API_Internal = "Cream_API_Internal";
public const string Cream_API_TEST_Step_1 = "Cream_API_TEST_Step_1";
public const string Cream_API_QA_Step_2 = "Cream_API_QA_Step_2";
public const string Cream_API_PROD_Step_3 = "Cream_API_PROD_Step_3";
}
}
- Usage examples:
/// <summary>
/// BVT Test: Validate 200 status code of GetPing API call.
/// </summary>
[Category(SharedCategory.All_BVT)]
[Category(CreamCategory.Cream_API_All)]
[Category(CreamCategory.Cream_API_BVT)]
[TestCase]
[Retry(2)]
[Repeat(1)]
public void CreamGetPing()
/// <summary>
/// Smoke Test: Validate 200 status code of GetAuthorizations API call.
/// </summary>
[Category(SharedCategory.All_Smoke)]
[Category(CreamCategory.Cream_API_All)]
[Category(CreamCategory.Cream_API_Smoke)]
[TestCase]
[Retry(2)]
[Repeat(1)]
public void GetAuthorizations()
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Appium.WebDriver (>= 6.0.1)
- AutoItX.Dotnet (>= 3.3.14.5)
- Castle.Core (>= 5.1.1)
- DotNetSeleniumExtras.PageObjects (>= 3.11.0)
- DotNetSeleniumExtras.WaitHelpers (>= 3.11.0)
- EntityFramework (>= 6.5.1)
- IBM.Data.DB.Provider (>= 11.5.9000.4)
- Microsoft.Bcl.AsyncInterfaces (>= 8.0.0)
- Microsoft.Data.SqlClient (>= 5.2.2)
- Microsoft.NETCore.Platforms (>= 7.0.4)
- Microsoft.Web.Administration (>= 11.1.0)
- Net.IBM.Data.Db2 (>= 7.0.0.400)
- Newtonsoft.Json (>= 13.0.3)
- NUnit (>= 4.2.2)
- NUnit3TestAdapter (>= 4.6.0)
- Oracle.EntityFrameworkCore (>= 7.21.13)
- Selenium.Support (>= 4.26.1)
- Selenium.WebDriver (>= 4.26.1)
- Syroot.Windows.IO.KnownFolders (>= 1.3.0)
- System.Data.SqlClient (>= 4.9.0)
- System.Diagnostics.DiagnosticSource (>= 8.0.1)
- System.Diagnostics.EventLog (>= 8.0.1)
- System.Management (>= 8.0.0)
- System.Net.Http (>= 4.3.4)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.0)
- System.Runtime.Handles (>= 4.3.0)
- System.Security.AccessControl (>= 6.0.1)
- System.Security.Cryptography.X509Certificates (>= 4.3.2)
- System.ServiceProcess.ServiceController (>= 8.0.1)
- System.Text.Encodings.Web (>= 8.0.0)
- System.Text.Json (>= 8.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.4.3 | 52 | 11/22/2024 |