+ Start a Discussion
Arvind Singh 68Arvind Singh 68 

difference between isSetup and SeeAllData(true) annotation?

Best Answer chosen by Arvind Singh 68
Akshay_DhimanAkshay_Dhiman
Hi Arvind

Why not to use (SeeAllData == true) in Test class

This is because of the following reason -

1. isTest(SeeAllData=true) Annotation your test class or test method with IsTest(SeeAllData=true) to open up data access to records in your organization
2. Starting with Apex code saved using Salesforce API version 24.0 and later, test methods don’t have access
by default to pre-existing data in the organization, such as standard objects, custom objects, and custom settings
data, and can only access data that they create.
3.  You must create test data for each test. You can disable this restriction by annotating your test class or
test method with the IsTest(SeeAllData=true) annotation. For more information, see IsTest(SeeAllData=true)
Annotation.
4. sTest(SeeAllData=true) is used to open up data access to records in your organization.some time it can create the problem.
5. Also If you use the (SeeAllData=true), it might happen that test class pass in the sandbox but fails in production while deployment


You can use @testSetup Annotation for creating data for the test class

Apex has introduced new method in Test class known as “Test Setup”. Following are some highlights and considerations of using Test Setup method in Test classes :

1. It needs to be marked with @testSetup annotation in Test class
2. One Test class can have only one @testSetup methods
3. These test setup methods are implicitly invoked before each test methods
4. These methods can be used to create test records specific to Test class
5. It helps to keep Test classes isolated and independent of helper or utility classes
6. It can’t be used if Test class is marked with @isTest(SeeAllData=true)
7. If error occurs in setup method then entire test class fails
8. If non-test method is called from setup method then no code coverage is calculated for non-test method
9. If multiple set up method is written in Test class then sequence of execution of those methods are not guaranteed


********************Example**********************************
@isTest
private class CommonTestSetup {

    @testSetup static void setup() {
        // Create common test accounts
        List<Account> testAccts = new List<Account>();
        for(Integer i=0;i<2;i++) {
            testAccts.add(new Account(Name = 'TestAcct'+i));
        }
        insert testAccts;        
    }
    
    @isTest static void testMethod1() {
        // Get the first test account by using a SOQL query
        Account acct = [SELECT Id FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Modify first account
        acct.Phone = '555-1212';
        // This update is local to this test method only.
        update acct;
        
        // Delete second account
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // This deletion is local to this test method only.
        delete acct2;
        
        // Perform some testing
    }

    @isTest static void testMethod2() {
        // The changes made by testMethod1() are rolled back and 
        // are not visible to this test method.        
        // Get the first account by using a SOQL query
        Account acct = [SELECT Phone FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Verify that test account created by test setup method is unaltered.
        System.assertEquals(null, acct.Phone);
        
        // Get the second account by using a SOQL query
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // Verify test account created by test setup method is unaltered.
        System.assertNotEquals(null, acct2);
        
        // Perform some testing
    }

}



Please mark as best answer if it helps you.

Thank You

 

All Answers

HARSHIL PARIKH AKA:GovindHARSHIL PARIKH AKA:Govind
Do you mean @TestSetUp vs SeeAllData = TRUE?
Raj VakatiRaj Vakati
TestSetUp 

Use test setup methods (methods that are annotated with @testSetup) to create test records once and then access them in every test method in the test class. Test setup methods can be time-saving when you need to create reference or prerequisite data for all test methods, or a common set of records that all test methods operate on.

SeeAllData TRUE
 with IsTest(SeeAllData=true) to your test class is able to access all the records in your organization.
Raj VakatiRaj Vakati
TestSetUp 

Use test setup methods (methods that are annotated with @testSetup) to create test records once and then access them in every test method in the test class. Test setup methods can be time-saving when you need to create reference or prerequisite data for all test methods, or a common set of records that all test methods operate on.

SeeAllData TRUE
 with IsTest(SeeAllData=true) to your test class is able to access all the records in your organization.
Akshay_DhimanAkshay_Dhiman
Hi Arvind

Why not to use (SeeAllData == true) in Test class

This is because of the following reason -

1. isTest(SeeAllData=true) Annotation your test class or test method with IsTest(SeeAllData=true) to open up data access to records in your organization
2. Starting with Apex code saved using Salesforce API version 24.0 and later, test methods don’t have access
by default to pre-existing data in the organization, such as standard objects, custom objects, and custom settings
data, and can only access data that they create.
3.  You must create test data for each test. You can disable this restriction by annotating your test class or
test method with the IsTest(SeeAllData=true) annotation. For more information, see IsTest(SeeAllData=true)
Annotation.
4. sTest(SeeAllData=true) is used to open up data access to records in your organization.some time it can create the problem.
5. Also If you use the (SeeAllData=true), it might happen that test class pass in the sandbox but fails in production while deployment


You can use @testSetup Annotation for creating data for the test class

Apex has introduced new method in Test class known as “Test Setup”. Following are some highlights and considerations of using Test Setup method in Test classes :

1. It needs to be marked with @testSetup annotation in Test class
2. One Test class can have only one @testSetup methods
3. These test setup methods are implicitly invoked before each test methods
4. These methods can be used to create test records specific to Test class
5. It helps to keep Test classes isolated and independent of helper or utility classes
6. It can’t be used if Test class is marked with @isTest(SeeAllData=true)
7. If error occurs in setup method then entire test class fails
8. If non-test method is called from setup method then no code coverage is calculated for non-test method
9. If multiple set up method is written in Test class then sequence of execution of those methods are not guaranteed


********************Example**********************************
@isTest
private class CommonTestSetup {

    @testSetup static void setup() {
        // Create common test accounts
        List<Account> testAccts = new List<Account>();
        for(Integer i=0;i<2;i++) {
            testAccts.add(new Account(Name = 'TestAcct'+i));
        }
        insert testAccts;        
    }
    
    @isTest static void testMethod1() {
        // Get the first test account by using a SOQL query
        Account acct = [SELECT Id FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Modify first account
        acct.Phone = '555-1212';
        // This update is local to this test method only.
        update acct;
        
        // Delete second account
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // This deletion is local to this test method only.
        delete acct2;
        
        // Perform some testing
    }

    @isTest static void testMethod2() {
        // The changes made by testMethod1() are rolled back and 
        // are not visible to this test method.        
        // Get the first account by using a SOQL query
        Account acct = [SELECT Phone FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Verify that test account created by test setup method is unaltered.
        System.assertEquals(null, acct.Phone);
        
        // Get the second account by using a SOQL query
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // Verify test account created by test setup method is unaltered.
        System.assertNotEquals(null, acct2);
        
        // Perform some testing
    }

}



Please mark as best answer if it helps you.

Thank You

 
This was selected as the best answer
Ajay K DubediAjay K Dubedi
Hi Arvind,

Why not to use (SeeAllData == true) in Test class

This is because of the following reason -

1. isTest(SeeAllData=true) Annotation your test class or test method with IsTest(SeeAllData=true) to open up data access to records in your organization
2. Starting with Apex code saved using Salesforce API version 24.0 and later, test methods don’t have access
by default to pre-existing data in the organization, such as standard objects, custom objects, and custom settings
data, and can only access data that they create.
3.  You must create test data for each test. You can disable this restriction by annotating your test class or
test method with the IsTest(SeeAllData=true) annotation. For more information, see IsTest(SeeAllData=true)
Annotation.
4. sTest(SeeAllData=true) is used to open up data access to records in your organization.some time it can create the problem.
5. Also If you use the (SeeAllData=true), it might happen that test class pass in a sandbox but fails in production while deployment

Use test setup methods (methods that are annotated with @testSetup) to create test records once and then access them in every test method in the test class. Test setup methods can be time-saving when you need to create reference or prerequisite data for all test methods, or a common set of records that all test methods operate on.

SeeAllData TRUE
 with IsTest(SeeAllData=true) to your test class is able to access all the records in your organization.



You can use @testSetup Annotation for creating data for test class


*********************Example***********************************
@isTest
private class CommonTestSetup {

    @testSetup static void setup() {
        // Create common test accounts
        List<Account> testAccts = new List<Account>();
        for(Integer i=0;i<2;i++) {
            testAccts.add(new Account(Name = 'TestAcct'+i));
        }
        insert testAccts;        
    }
    
    @isTest static void testMethod1() {
        // Get the first test account by using a SOQL query
        Account acct = [SELECT Id FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Modify first account
        acct.Phone = '555-1212';
        // This update is local to this test method only.
        update acct;
        
        // Delete second account
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // This deletion is local to this test method only.
        delete acct2;
        
        // Perform some testing
    }

    @isTest static void testMethod2() {
        // The changes made by testMethod1() are rolled back and 
        // are not visible to this test method.        
        // Get the first account by using a SOQL query
        Account acct = [SELECT Phone FROM Account WHERE Name='TestAcct0' LIMIT 1];
        // Verify that test account created by test setup method is unaltered.
        System.assertEquals(null, acct.Phone);
        
        // Get the second account by using a SOQL query
        Account acct2 = [SELECT Id FROM Account WHERE Name='TestAcct1' LIMIT 1];
        // Verify test account created by test setup method is unaltered.
        System.assertNotEquals(null, acct2);
        
        // Perform some testing
    }

}


Hope this helps.
Mark it as Best Answer if find helpful.

Thank You
Ajay Dubedi