Developer guide for making Integration Tests

From Izara Wiki
Revision as of 08:39, 18 February 2025 by Pong (talk | contribs)
Jump to navigation Jump to search

Overview

Setup integrationtest

Step 1; Create object in bucket

  1. Create your folder in bucket integrationtest-config-us-east-2/test_config/{your folder name} in S3 bucket
    • {your folder name} maybe is your nickname eg. jamesDev, nicoleDev
    • Can create a subfolder in your folder for each test case or service that you want to test
    eg. - integrationtest-config-us-east-2/test_config/jamesDev/SellOfferManager
    - integrationtest-config-us-east-2/test_config/jamesDev/ProcessLogical
    - integrationtest-config-us-east-2/test_config/jamesDev/SellOfferManager/ProcessLogical
  2. Create a file in a folder that is used for testing
    • resources.json / events.json / tests.json
    • resources.json and events.json is json object
    • tests.json is json array of objects
    • Can create these files in a SharedResource folder and share it with another test for collaborative usage
    eg. integrationtest-config-us-east-2/test_config/jamesDev/SellOfferManager/SharedResource/resources.json
    • In the main prefix for testing, you don’t need to upload every file. If you have a file in SharedResource, you can skip uploading it 
    1. resources.json
      • Have 2 main object keys is Lambda and Dynamodb
      { 
      	"Lambda":{
      		"{FunctionNameHdrSqs}":{ 
      		"localLacation":"/src/FunctionNameHdrSqs.js",
      		"localHandler":"main", 
      		"functionName":"FunctionNameHdrSqs"	// FunctionName is full name of function after deploy
      		},
      		"ProcessComplexFilterHdrSqs":{ 
      		"localLacation":"/src/ProcessComplexFilterHdrSqs.js", 
      		"localHandler":"main", 
      		"functionName":"ProcessComplexFilterHdrSqs" 
      		},
      		... 
      	},
      	"Dynamodb": {
      		"filterMain":{ 
      			"tableName":"filterMain" 
      		}, 
      		"tableNameBB":{ 
      			"tableName":"tableNameBB" 
      		},
      		... 
      	}
      }
      
    2. events.json
      • Multiple eventTags can be added to a single file
      • Have 6 types of events; Dynamodb, Sns/Sqs, Dsq, Invoke, API and NoRetryError
      // Layout of file events.json 
      { 
      	input:{}, 
      	output:{}, 
      	dynamodb:{}
      } 
      
      // An example of naming an eventTag for each event
      {
      	"Complexfilter_ProcessComplexfilter_logical_basic": {},					          // for input 
      	"Output_Complexfilter_ProcessComplexfilter_logical_basic": {},				      // for output
      	"Complexfilter_ProcessComplexfilter_logical_basic__dynamodb_update_FilterMain": {}  // for dynamodb
      }
      
      • "Complexfilter_ProcessComplexfilter_logical_basic" is called {inputEventTag}
      • for {outputEventTag} is Output_{inputEvenTag}
      eg. "Output_Complexfilter_ProcessComplexfilter_logical_basic"
      • for dynamodb is {inputEventTag}__dynamodb_{action}_{tablename}
      eg. "Complexfilter_ProcessComplexfilter_logical_basic__dynamodb_update_FilterMain"
      {action} is only put or update, and in case of update, must only test the last step of update
      // An example input and output event of Sns/Sqs, Dsq and Invoke
      {
      	"Complexfilter_ProcessComplexfilter_logical_basic": { 
      		"forStageMatching": true,        
      		"properties": { 
      			"propertyA": { 
      				"forStageMatching": true,  
      				"value": "valueProperty1", 
      			}, 
      			"propertyB": { 
      				"testValueMatches": false,  // no child properties will be tested 
      				"properties": { 
      					"propertyB1": { 
      						"value": "valuePropertyB1", 
      					} 
      				} 
      			}, 
      			"propertyC": { 
      				"eventValue": [ 
      					"valuePropertyC1", 
      					"valuePropertyC2", 
      					"valuePropertyC3", 
      				] 
      			} 
      		}, 
      		
      		// settings for Sns/Sqs
      		"snsSqsTrigger": true,        // set when event is initial stage of Sns
      		"messageAttributes": {        // optional 
      			"forStageMatching": true, 
      			"properties": { 
      				"msgTag": { 	      // require 
      					"value": "msgTag" 
      				}, 
      				"propertyD": { 
      					"forStageMatching": true,     // default: false, whether this property is used to match stage config during integration tests
      					"testValueMatches": false,    // default: true, whether value of this property is checked when performing test
      					"value": "valuePropertyD" 
      				} 
      			} 
      		} 
      		
      		// settings for Dsq
      		// DirectSqs set in HdrDsq if have messageAttributeValidatorSchema and required property in messageAttributes eg: messageTag 
      		"DirectSqs": true, 			// set when event is initial stage of Dsq
      		"messageAttributes": { 	    // optional  
      			"messageTag": { 
      				"DataType": "String", 
      				"StringValue": "messageAttributes_is" 
      			} 
      		} 
      	}, 
      	"Output_Complexfilter_ProcessComplexfilter_logical_basic": { 
      		"forStageMatching": true,        
      		"properties": { 
      			"propertyA": { 
      				"forStageMatching": true,  
      				"value": "valueProperty1", 
      			}
      			...
      		}
      	}
      }
      
      • forStageMatching default: false, whether this property is used to match stage config during integration tests. Use in test importent parameter
      • testValueMatches default: true, whether value of this property is checked when performing test. For random eg. timeStamp or uuid
      • If value in array or number or string is random. Use testValueMatches: true not set forStageMatching: true
      // An example input and output event of API
      {
      	"LambdaFunctionHdrApi_input__pass_notTestAuthorizer": { 
      		"forstageMatvhing": true, 
      		"properties": { 
      			"body": { 
      				"properties": { 
      					"propertyA": { 
      						"testValueMatches": false, 
      						"value": "valueProperty1", 
      					}, 
      					"propertyB": { 
      						"properties": { 
      							"propertyB1": { 
      								"value": "valuePropertyB1", 
      							} 
      						} 
      					}, 
      					"propertyC": { 
      						"eventValue": [ 
      							"valuePropertyC1", 
      							"valuePropertyC2", 
      							"valuePropertyC3", 
      						] 
      					},
      					... 
      				} 
      			} 
      		}
      	}, 
      	"Output_LambdaFunctionHdrApi_input__pass_notTestAuthorizer": { 
      		"properties": { 
      			"body": { 
      				"properties": { 
      					"propertyA": { 
      						"testValueMatches": false, 
      						"value": "valueProperty1"
      					}, 
      					...
      				} 
      			} 
      		}  
      	}
      }
      
      // An example event of Dynamodb 
      {
      	{inputEventTag}__dynamodb_{action}_{tablename}: { // eg. "Complexfilter_ProcessComplexfilter_logical_basic__dynamodb_update_FilterMain"
      		"forStageMatching": true, 
      		"properties": { 
      			(property is update)... 
      		}, 
      		"keyValues": { 
      			{partitionKey}: "4865d2451a621cb7f71225cfabf2df4f98e20801 ", 
      			{sortKey}: "cdb170690571df7522b3850920fce02507c077ee" 
      		} 
      	} 
      }
      
      // An example event of NoRetryError output 
      {
      	Output_{inputEvenTag}: { // eg. "Output_Complexfilter_ProcessComplexfilter_logical_basic"
      		"forStageMatching": true, 
      		"properties": { 
      			"errorMessage": { 
      				"value": "Not found schema of {serviceTag:TestGraphHandler, objectType:notFoundObjType}" 
      			} 
      		} 
      	} 
      }
      
    3. tests.json
      // An example test 
      [ 
      	{ 
      		"integrationTestTag": "test_S3_ByDev", 
      		"productionSafe": false, 
      		"errorIfStageUnderfined": false, 
      		"errorIfInvokeUnderfined": false, 
      		"stages": [
      			{ 
      				"initialStage": true, 
      				"inputEventTag": "Complexfiter_ProcessComplexfiter_logical_basic", 
      				"serviceName": "ComplexFilter", 
      				"resourceType": "Lambda", 
      				"resourceName": "ProcessComplexFilterHdrSqs", 
      				"snsServiceName": "ComplexFilter",     // if snsSqsTrigger = true but not set snsServiceName or snsTopic --> will direct invoke 
      				"snsTopic": "InProcessComplexFilter",  // if snsSqsTrigger = true but not set snsServiceName or snsTopic --> will direct invoke
      				"outputEventTag": "Output_Complexfiter_ProcessComplexfiter_logical_basic", 
      				
      				
      				// Settings if have test dynamodb
      				"dynamodbOutputEventIdentifiers": [ 
      					{ 
      						"serviceName": "ComplexFilter", 
      						"resourceName": "FilterMain", 
      						"eventTag": "Complexfiter_ProcessComplexfiter_logical_basic_dynamodb_update_FilterMain"
      					},
      					... 
      				],
      				
      				
      				// Settings multiple stage for invoke
      				"invokes": [ 
      					{ 
      						"eventStageTag": "GraphHandler_GetNodeV2_NomalCase" 
      					},
      					... 
      				], 	 
      			},
      			{ 
      				"eventStageTag": "GraphHandler_GetNodeV2_NomalCase" // require "eventStageTag" if have settings multiple stage for invoke
      				"inputEventTag": "SellOfferMgr_ProcessLogical_logical_integrationTesting_returnObject",
      				"serviceName": "SellOfferMgr", 
      				"resourceType": "Lambda", 
      				"resourceName": "ProcessLogicalHdrSqs", 
      				"outputEventTag": "output_intTesting_ProcessLogical_logical_integrationTesting_returnObject", 
      			},
      			... 
      		] 
      	},
      	... 
      ]