'Managing memory using TestNG framework while running selenium webdriver testings
I encounter memory issues where the automation suite which I am running is stuck at some point in a way that I cannot explain or understand, I am using TestNG framework to run my automation test suite the test is using 10 threads (configured in testng.xml file with selenium 3) and the test itself is running of jenkins (I am using docker to run the project), this is my testng.xml setup:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="Automation_Suite" parallel="tests" thread-count="10">
<!-- ================================CMS-PART-START=====================================-->
<test name="Categories Test Happy Flow" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.categories.CategoriesTestHappyFlow"/>
</classes>
</test>
<test name="Categories Test Negative Flow" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.categories.CategoriesTestNegativeFlow"/>
</classes>
</test>
<test name="Icon Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.content_manager.icons.ContentManagerIconTest"/>
</classes>
</test>
<test name="Presentation Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.content_manager.presentations.ContentManagerPresentationTest"/>
</classes>
</test>
<test name="Video Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.content_manager.videos.ContentManagerVideoTest"/>
</classes>
</test>
<test name="Cyberpedia Categories Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.pedia.PediaCategoriesTest"/>
</classes>
</test>
<test name="Quizzes Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.pedia.QuizzesTest"/>
</classes>
</test>
<test name="Terms Test Happy Flow" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.pedia.TermsTestHappyFlow"/>
</classes>
</test>
<test name="Terms Test Negative Flow" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.pedia.TermsTestNegativeFlow"/>
</classes>
</test>
<!-- <!– ===========================================================================–>-->
<test name="Classes Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.institutions.ClassesTest"/>
</classes>
</test>
<test name="College Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.institutions.CollegeTest"/>
</classes>
</test>
<test name="Institution Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.institutions.InstitutionTest"/>
</classes>
</test>
<!-- ===========================================================================-->
<test name="Char Limitations Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.lessons.CharactersLimitationTest"/><!--verify there are no lessons before running this test-->
</classes>
</test>
<test name="General Information Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.lessons.EditPracticeArenaLessonGeneralInformationTest"/><!--verify there are no lessons before running this test-->
</classes>
</test>
<test name="Lesson Materials Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.lessons.EditPracticeArenaLessonLessonMaterialsTest"/>
</classes>
</test>
<test name="Module Creation Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.modules.PracticeArenaCreateNewModuleTest"/>
</classes>
</test>
<test name="Lesson Assigned Modules Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.modules.PracticeArenaLessonAssignedModulesTest"/>
</classes>
</test>
<test name="Lesson List Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.lessons.PracticeArenaLessonListTest"/>
</classes>
</test>
<test name="Module Skills Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.modules.PracticeArenaModuleSkillsTest"/>
</classes>
</test>
<test name="Module List Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.modules.PracticeArenaModulesListTest"/>
</classes>
</test>
<test name="Upload Lesson Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.practice_arena.lessons.UploadNewPALessonTest"/>
</classes>
</test>
<!-- ===========================================================================-->
<test name="Create syllabus Happy Flow Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.syllabi.CreateSyllabiHappyFlowTest"/>
</classes>
</test>
<test name="Create syllabus Negative Flow Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.syllabi.CreateSyllabiNegativeFlowTest"/>
</classes>
</test>
<test name="Create Complex User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.ComplexCreateUserTest"/>
</classes>
</test>
<test name="Create Admin User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.CreateAdminTest"/>
</classes>
</test>
<test name="Create Candidate User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.CreateCandidateTest"/>
</classes>
</test>
<test name="Create Demo User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.CreateDemoTest"/>
</classes>
</test>
<!-- <test name="Create Master User Test" parallel="false">-->
<!-- <parameter name="username" value=""/>-->
<!-- <classes>-->
<!-- <class name="com.hackeruso.automation.ui.cms.users.CreateMasterTest"/>-->
<!-- </classes>-->
<!-- </test>-->
<test name="Create Student User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.CreateStudentTest"/>
</classes>
</test>
<test name="Create Teacher User Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.CreateTeacherTest"/>
</classes>
</test>
<test name="Edit Student Panel Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.EditStudentPanelTest"/>
</classes>
</test>
<test name="Edit User Panel Test" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.EditUserPanelTest"/>
</classes>
</test>
<test name="Prod Sanity - Reports in CMS section" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.cms.users.ProdSanityReportsCMSPageTest"/>
</classes>
</test>
<!-- ================================CMS-PART-END=====================================-->
<!-- ================================WEBSITE-PART-START=====================================-->
<test name="Prod Sanity - Every Tab is Accessible - Website section" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.website.home.ProdSanityEveryTabAccessibleTest"/>
</classes>
</test>
<test name="Prod Sanity - Post Support Test - Website section" parallel="false">
<parameter name="username" value=""/>
<classes>
<class name="com.hackeruso.automation.ui.website.support.PostLoginSupportTest"/>
</classes>
</test>
</suite>
and I am using docker compose file to run the automation suite on top of it and this is the docker compose file:
version: '3'
services:
cywar-test-automation:
image: markhobson/maven-chrome:jdk-11
stop_signal: SIGKILL
stdin_open: true
tty: true
privileged: true
user: root
working_dir: /opt/neo
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./:/opt/neo
- /dev/shm:/dev/shm
command: mvn clean test -Pregression
environment:
- MAVEN_OPTS=-Xms24g -Xmx24g
When I am running the automation suite I see that not all chrome processes are being closed after the test is over although I am using 'driver.quit'
this is how my webdriver initialization looks like:
public class BaseUiTest extends BaseApiTest {
private final Browser BROWSER = Browser.valueOf(EnvConf.getProperty("ui.browser.type"));
protected String ADMIN_USERNAME;
protected final String ADMIN_PASSWORD = EnvConf.getProperty("hackeruso.admin.user.password");
protected DriverFactory driver;
protected LoginPage loginPage;
protected CmsPage cmsPage;
protected UpperManagementToolBar upperManagementToolBar;
protected WebSiteCommonPage webSiteCommonPage;
@BeforeClass(alwaysRun = true)
@Parameters({"username"})
public final void BaseUiSetup(ITestContext context, @Optional String username){
if(username!=null) {
this.ADMIN_USERNAME = username; //For running tests using maven command with testng xml file
}else{
this.ADMIN_USERNAME = EnvConf.getProperty("hackeruso.admin.user.email"); //For running tests locally from IDE
}
open();
}
protected void open() {
driver = DriverFactory.open(BROWSER, TEST_DOWNLOAD_FOLDER);
loginPage = new LoginPage(driver);
cmsPage = new CmsPage(driver);
webSiteCommonPage = new WebSiteCommonPage(driver);
upperManagementToolBar = new UpperManagementToolBar(driver);
}
protected void navigateTo(String url) {
driver.get(url);
Log.i("Successfully navigated to =[%s]", url);
}
@AfterClass(alwaysRun = true)
public final void baseTeardown() {
Date testEndTime = new Date();
if (driver != null) {
printBrowserLog();
driver.quit();
}
Log.i("testEndTime=[%s]", testEndTime);
}
public DriverFactory getDriver() {
return driver;
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
