AutomationTools 1.1.7

dotnet add package AutomationTools --version 1.1.7
NuGet\Install-Package AutomationTools -Version 1.1.7
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AutomationTools" Version="1.1.7" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutomationTools --version 1.1.7
#r "nuget: AutomationTools, 1.1.7"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AutomationTools as a Cake Addin
#addin nuget:?package=AutomationTools&version=1.1.7

// Install AutomationTools as a Cake Tool
#tool nuget:?package=AutomationTools&version=1.1.7

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.

What's New?

  1. 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.

  1. Shared (API and UI) Tools

    1. Automation Logger
      1. AddToLog()
        1. 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}");
        
      2. LogWarning()
        1. Log a warning, this should not be used for validation logging.
      3. LogError()
        1. Log an error. This should be used for any condition that would indicate a test/feature failure.
         AutomationLogger.LogError($"{eventDB} not found in DB");
        
      4. GetPST()
        1. Returns the current time in PST timezone, most applications need PST time, all logs are in PST time.
      5. SetBaseURL()
        1. 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");
         }
        
      6. SetDBType()
        1. 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";
         }
        
      7. ConfigureLogger()
        1. 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);
         }
        
      8. ReconfigureLogger()
        1. 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");
        
      9. LogTestResult()
        1. 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);
        }
        
      10. TestConditionsNotMet()
        1. 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")}");
        
      11. NoErrorsPresent()
        1. This is an essential function. API helper functions should return a boolean using this function.
        return AutomationLogger.NoErrorsPresent();
        
      12. CatchException()
        1. 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);
        }
        
      13. LogDBQuery()
        1. 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));
        
      14. LogValueMismatch()
        1. 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");
        }
        
    2. Randomizer Tool
      1. GetRandomDate()
        1. Gets a random date between the base date and today. Default base date is 1/1/2000.
      2. GetRandomFutureDate()
        1. Gets a random date in the future. Optional variables can be supplied to adjust the range.
      3. GetRandomDateInRange()
        1. 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));
        
      4. GetRandomString()
        1. Creates a pseudo random string. Default length is 10 characters and numbers are inlcuded by default.
        // 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)}" }
        };
        
      5. GetRandomTime()
      6. GetRandomObjectFromCollection()
        1. This will select a random object from the supplied collection. Works with Lists and Arrays.
        2. 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!);
        
      7. GetRandomDoubleAsString()
    3. Extensions
      1. IsNullOrEmpty()
        1. 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())
        
      2. DateFormat()
        1. 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))
        
      3. DatesMatch()
        1. This function has four variants:
          1. Compare two strings
          2. Compare a DateTime object and a string
          3. Compare a string and a DateTime object
          4. Compare two DateTime objects
        2. 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");
        }
        
      4. StringsMatch()
        1. 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");
        }
        
      5. StringifyDictionary()
        1. 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);
        
      6. CombineDictionaries()
        1. 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);
        
      7. DictionariesMatch()
        1. This returns true if two dictionaries match completely. This has only been tested with <string, string> dictionaries.
      8. CompareBools()
        1. 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");
        }
        
    4. Encryption
    5. SQL Model Generator
      1. The parameters are the model type and the SQL data reader.
      2. Reader options:
        1. SQLDataReader
        2. DB2DataReader
        3. OracleDataReader
      3. Example usage:
       connection.Open();
       var reader = command.ExecuteReader();
      
       while (reader.Read())
       {
       	getScheduledClassesDbData.Add(ModelGenerator.GenerateModel<ScheduledClassesDetailsDB>(reader));
       }
      
       reader.Close();
      
      1. This removes the need to set each variable within a model.
      2. 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();
      
      1. Note: This requires DB models to have string parameters only.
  2. UI Tools

    1. Automation Element Manager
      TODO: List functions
    2. Automation Page Manager
      TODO: List functions
    3. Automation Core Driver
      TODO: List functions
    4. Automation SQL Tools
      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()

  1. 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";
  1. 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";
    }
}
  1. 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 Compatible and additional computed target framework versions.
.NET Framework net48 is compatible.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
1.1.7 142 8/17/2023
1.1.6 126 8/10/2023
1.1.5 146 8/4/2023
1.1.4 126 8/4/2023
1.1.3 123 8/3/2023
1.1.2 219 7/20/2023
1.1.1 117 7/20/2023
1.1.0 118 7/20/2023
1.0.9 172 5/27/2023
1.0.8 117 5/26/2023
1.0.7 109 5/26/2023
1.0.6 112 5/26/2023
1.0.5 122 5/26/2023
1.0.4 120 5/26/2023
1.0.3 120 5/26/2023
1.0.1 117 5/25/2023
1.0.0 117 5/25/2023

Requires Appium version 5 in beta NuGet\Install-Package Appium.WebDriver -Version 5.0.0-beta01