...
For identifying a particular Test case is python a new field will be introduced in managed scripts. This new field will be used to mark particular test case as Python or not. The below are the stepwise information on how a particular test case will executed
- The below alter scripts needs to be executed in Automatics Orchestration DB
Code Block |
---|
language | sql |
---|
title | Alter scripts |
---|
linenumbers | true |
---|
|
alter table script_details add TEST_SCRIPT_TYPE varchar(25) default 'JAVA';
alter table script_details add IS_PYTEST_TC boolean default false;
insert into available_job_params (PARAMETER_NAME,UPDATED_BY) values ('Test_Script_Type','admin');
insert into available_job_params (PARAMETER_NAME,UPDATED_BY) values ('is_pytest_testCase','admin');
|
- At first Python test case should be added in automatics, for that when adding a new test case the new test case identification field should be selected as Python, the the second field to identify the particular test case is using Pytest framework or not .
- Once a Test case is triggered, Automatics will first check whether the test case is Python or not, by using the value in the new identification field.
- Once Jenkins job for Python script execution is triggered from automatics, it will pull the latest Python code from the configured repo along with the RDK B or V tests and it will invoke the corresponding Python script using Java Process builder based on the Automation ID of the test case.
...
- The below python script will invoke AutomaticsTapApi java class in Automatics Core to get the current execution mode if available AutomaticsTapAPI.py
Code Block |
---|
language | py |
---|
title | AutomaticsTapApi.py |
---|
linenumbers | true |
---|
|
# Boiler plate stuff to start the module
import json
import os
import jpype
import jpype.imports
from jpype.types import *
fromimport src.logging import AutomaticsPyLogger
logger = AutomaticsPyLoggerlogging.setup_logging(__name__getLogger()
# Launch the JVM
def launchJVM(automaticsPropsUrl,pathToExecJar):
if jpype.isJVMStarted():
logger.info('JVM is already running. Do not init twice!')
else:
logger.info('Inside else')
logger.info(jpype.getDefaultJVMPath())
javaClassPath = "-Djava.class.path="+pathToExecJar
propsJavaOpts = "-Dautomatics.properties.file="+automaticsPropsUrl
jpype.startJVM(jpype.getDefaultJVMPath(), "-ea", javaClassPath, propsJavaOpts)
# tapApi = AutomaticsTapApi.getInstance()
# import the Java modules
from com.automatics.tap import AutomaticsTapApi
from com.automatics.executor import PythonScriptExecutor
from com.automatics.utils import BeanUtils
def createDeviceObj(deviceJson):
pyexecutor = PythonScriptExecutor()
deviceObj = pyexecutor.convertJsonToDevice(deviceJson)
return deviceObj
def executeCommandUsingSsh(dut, command):
pyexecutor = PythonScriptExecutor()
return pyexecutor.executeCommandUsingSsh(dut, command)
def getInstance():
jpype.JClass("com.automatics.core.SupportedModelHandler").main([])
BeanUtils.startContext()
return AutomaticsTapApi.getInstance()
|
Sample code for an Automatics Test Case Written in Python and which use Utils and Core APIs for different operations
Code Block |
---|
language | py |
---|
title | Sample Automatics Python Script |
---|
linenumbers | true |
---|
|
import logging
from jpype.types import *
# Adding BroadBand CommonUtils from RDKB Utils projects
from com.automatics.rdkb.utils import BroadBandCommonUtils
from srcautomaticsPythonLib.annotation.PythonScriptAnnotation import TestCaseId
from src.comautomaticsPythonLib.automatics import AutomaticsTapApi
from src.logging import AutomaticsPyLogger
logger = AutomaticsPyLoggerlogging.setup_logging(__name__getLogger()
@TestCaseId('TC-RDKB-FSPYTHON-LAYOUTTEST-001')
def nvramFileSystemLayoutcheckImageVersionInDevice(dut):
testCaseId = "TC-RDKB-FSPYTHON-LAYOUTTEST-001";
tapEnv = AutomaticsTapApi.getInstance()
stepNum = "s1S1";
errorMessage = "nvramcommand isexecution notin properly mounted after code downloaddevice failed";
status = JBoolean(False);
logger.info("#######################################################################################");
logger.info("STARTING TEST CASE: TC-RDKB-FSPYTHON-LAYOUTTEST-1001001");
logger.info("TEST DESCRIPTION: nvramValidation fileof systemdevice layout validationversion");
logger.info("TEST STEPS : ");
logger.info("1. CheckRun whethera nvramCommand isin properlythe mounteddevice andVIA itSSH hasto read-parse write permission after code download");
logger.info("2. Verify the file access by creating a dummy file in nvramthe version.txt file");
logger.info("#######################################################################################");
try:
logger.info("**********************************************************************************");
logger.info("**********************************************************************************");
logger.info(
"STEP 1: DESCRIPTION : Check whether nvram is properly mounted and itValidate hasthe read-version writeof permissionthe after codedevice download");
logger.info(
"STEP 1: ACTION : \"checkRun mounteda statuscommand usingin mountthe command(mountdevice |to grepview -w \"nvram\") and verify read-write permission in nvramthe current RDK version in device\"");
logger.info(
"STEP 1: EXPECTED : nvramThe shouldcurrent beversion properlyin mountedthe anddevice should havebe read-write permission(mtd:data on /nvram type jffs2 (rw,relatime)received as response");
logger.info("**********************************************************************************");
response = tapEnv.executeCommandUsingSsh(dut, JString("mount | grep -w nvramcat /version.txt"));
logger.info(response)
except Exception as e:
logger.info(str(e))
finally:
logger.info("################### STARTING POST-CONFIGURATIONS ###################");
logger.info("POST-CONDITION STEPS");
logger.info("POST-CONDITION : DESCRIPTION : Remove dummy file");
logger.info("POST-CONDITION : ACTION : Remove the dummy file permanently (rm -rf /nvram/dummytest.sh)");
logger.info("POST-CONDITION : EXPECTED : Created dummy file should be removed");
status = BroadBandCommonUtils.removeFileAndVerifyStatus(tapEnv, dut, JString("/nvram/dummytest.sh"));
if status:
logger.info("POST-CONDITION : ACTUAL : Post condition executed successfully");
else:
logger.info("POST-CONDITION : ACTUAL : Post condition failed");
logger.info("POST-CONFIGURATIONS : FINAL STATUS - " + str(status));
tapEnv.updateExecutionStatus(dut, testCaseId, stepNum, JBoolean(status), errorMessage, JBoolean(False));
logger.info("################### COMPLETED POST-CONFIGURATIONS ###################"); |
Code Block |
---|
language | py |
---|
title | Sample PYTEST Test case |
---|
linenumbers | true |
---|
|
from unittest import result
import pytest
import logging
from jpype.types import *
from automaticsPythonLib.annotation.PythonScriptAnnotation import TestCaseId
from automaticsPythonLib.automatics import AutomaticsTapApi
logger = logging.getLogger()
@TestCaseId('TC-RDKB-PYTHON-PY-TEST-001')
def test_command_execution_in_device():
dut = pytest.Config.dut
tapEnv = pytest.Config.tapEnv
testCaseId = "TC-RDKB-PYTHON-PY-TEST-001";
stepNum = "S1";
errorMessage = "command execution in device failed";
status = JBoolean(False);
expected_result = False
print(dut)
response = tapEnv.executeCommandUsingSsh(dut, JString("pwd"));
if not response:
status = JBoolean(False);
else:
expected_result=True
status = JBoolean(True);
tapEnv.updateExecutionStatus(dut, testCaseId, stepNum, JBoolean(status), errorMessage, JBoolean(False));
assert expected_result == True, f"Expected {expected_result}, but got {response}"
|