SoapUI script logging content access when running with Maven or command line
- 8 years ago
Hello nmrao
To give you more details on what I was trying to achieve here ,
I have a test suite where I have many test cases , each test cases hitting on different API resources to fetch the response back. And in the tc request test step I have Script Assertions to validate the responses and various other things , I also try to fetch the full response contents in the same script assertions . And I am trying to log it , all responses and the results of other assertions etc .
And all these done by Groovy scripting ..
So basically I am interested to fetch all the Groovy Log contents , and I am also interested to write individual test case specific script logs to individual external file say a txt file ... this is for my later check and reference on response contents and other things.
When I perform the execution with SoapUI tool it self , this was easy to fetch the script logs with ,
def logArea = com.eviware.soapui.SoapUI.logMonitor.getLogArea( "script log" );
but this won't work when the same suite runs using Maven plugin, it will give a NullPointerException for the logMonitor part..
so I was looking for an another approach to get this done when the suite runs with maven or command line..
Now I figured out the below approach,
In SoapUI ,all the logging activities are done with the log4j framework, and default log4j configuration file can be seen in your soapUI installation {bin\soapui-log4j.xml}..
I am not modifying any thing in this xml file , instead I wrote a custom logger class using groovy which will get the default config logger instance with name ''groovy.log'' ... this 'groovy.log' can be seen in the above xml file ... to this instance I am applying a rolling appender with my own pattern layout
so the sample of groovy class will look like ,
import org.apache.log4j.FileAppender
import org.apache.log4j.Logger
import org.apache.log4j.PatternLayout
import org.apache.log4j.RollingFileAppenderclass LoggerClass {
def projectPath// constructor
LoggerClass(def projectPath)
{
this.projectPath=projectPath
}
def Logger getLogger(def testCaseName)
{
def path = "//target//groovy-explicit-logs//"
def fileName = projectPath + path +testCaseName+".log"
def groovyLogger = Logger.getLogger('groovy.log')
PatternLayout layout = new PatternLayout("%d{HH:mm:ss,SSS} %-5p %x - %m%n")
RollingFileAppender fileAppender = new RollingFileAppender(layout, fileName)
groovyLogger.addAppender(fileAppender)
return groovyLogger
}}
//testCaseName - is my test case name
//projectPath - is my project path
// just passing this during run to keep the log file in that location..
I will compile this groovy class and make a jar of it , and then keeps in the classpath .
If you running soapUI tool, in the {ext} folder of installation. or in the Maven class path if i am running using maven..
Later in each test case script assertion I will invoke this logger.and using that logger instance I will do all my logging activities
import net.LoggerClass
def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
def projectPath = groovyUtils.projectPath
def testCase = messageExchange.modelItem.testStep.testCase.name// this is the class you have written earlier,
LoggerClass loggerClass = new LoggerClass(projectPath)
def log = loggerClass.getLogger(testCase)log.info "log what ever you want .."
Finally I was achieving individual test case groovy log contents in individual log files it self ...
Please let me know if you have come across any better approach.
Thanks & Warm Regards
Musaffir