【问题标题】:Is there are cleaner way to Structure your TestNG test cases?是否有更简洁的方法来构建您的 TestNG 测试用例?
【发布时间】:2016-02-11 16:32:50
【问题描述】:

我的问题更多与结构/清洁度有关。我在 TestNG 中有一个测试脚本,并希望添加测试用例来扩展。我想知道是否有一种干净的方法来重复测试用例。示例:

我能做到:

@Test(priority=0, name = login )
//some code

@Test(priority=2, name = submit )
//some code

@Test(priority=3, name = accept )

这只是一个测试场景。现在我想为不同的流程做同样的事情,但测试用例正在重复......示例:

@Test(priority=0, name = login )
//some code

@Test(priority=2, name = submit )
//some code

@Test(priority=3, name = rejected )

在这两个流程中,我重复登录和提交的地方有 2 个测试是相同的。流程的唯一变化是每次提交后会发生什么,例如提交,拒绝,取消等。我只知道一种方法,那就是重复编写登录名并每次提交。

问题是,有没有更好/更简洁、更有条理的方式来编写这个,而不是下面我每次都重复登录的方式?

@Test(priority=0, name = login )
//some code

@Test(priority=2, name = submit )
//some code

@Test(priority=3, name = accept )
//Some code

@Test(priority=4, name = login )
//some code

@Test(priority=5, name = submit )
//some code

@Test(priority=6, name = rejected )
//some code
.
.
.
@Test(priority=n ... 

【问题讨论】:

    标签: java eclipse selenium testing testng


    【解决方案1】:

    如果您的目标是消除重复测试,如何通过在testng.xml file 中指定这样来创建更多个性化测试并多次运行它们?

    例如,你可以这样做:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <suite name="Test Suite 1">
        <test name="Test Set 1">
            <classes>
                <class name="test.mytest.Test1" />
                <class name="test.mytest.Test2" />
            </classes>
        </test>
        <test name="Test Set 2">
            <classes>
                <class name="test.mytest.Test1" />
                <class name="test.mytest.Test3" />
            </classes>
        </test>
    </suite>
    

    将您的课程设置为:

    public class Test1 {
    
        @BeforeMethod
        public void before(){
            System.out.println("==Before method==");
        }
    
        @Test
        public void testLogin(){
            System.out.println("test login");
        }
    
        @Test
        public void testSubmit(){
            System.out.println("test submit");
        }
    
    }
    
    public class Test2 {
    
        @Test
        public void testAccept(){
            System.out.println("test accept");
        }
    
    }
    
    public class Test3 {
    
        @Test
        public void testReject(){
            System.out.println("test reject");
        }
    
    }
    

    运行时(我在示例中使用了 Maven),将产生:

    Running TestSuite
    ==Before method==
    test login
    ==Before method==
    test submit
    test accept
    ==Before method==
    test login
    ==Before method==
    test submit
    test reject
    Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.253 sec - in TestSuite
    

    在本例中,我按类组织它们,但您可以按组、方法等组织。

    编辑 根据您的评论,我添加了一个使用 @BeforeMethod 的示例并生成了输出。

    如果您希望专门重用您的@BeforeMethod,我想您总是可以将其放入基类并让您的测试用例对其进行扩展:

    public class TestBase {
    
        @BeforeMethod
        public void before(){
            System.out.println("==Before method==");
        }
    }
    
    public class Test1 extends TestBase{
    
        @Test
        public void testLogin(){
            System.out.println("test login");
        }
    
        @Test
        public void testSubmit(){
            System.out.println("test submit");
        }
    
    }
    

    我从来不需要做这样的事情,所以我无法就最佳实践与它交谈,但它会起作用。

    【讨论】:

    • 这看起来可以解决我需要它做的事情。虽然,后续问题是,beforeMethod 会在哪里?
    • 我不确定您使用它的目的是什么,所以很难说它应该用于您的具体情况。我修改了答案以显示使用 @BeforeMethod 的示例及其将产生的输出。
    • 完美。这正是我想要的。
    • 很高兴听到这个消息。如果是这种情况,您介意将问题标记为已回答吗?
    【解决方案2】:

    这行得通吗?

    public class BeforeStuff {
    @BeforeMethod()
    }
    
    public class Test1 {
        @Test
        @Test
    }
    
    public class Test2 {
        @Test
    }
    
    public class Test3 {
        @Test
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多