有赞测试团队–读后感

看了有赞测试团队的分享内容,了解到了团队与团队之间的差别;

1.团队把所有精力都投资在接口自动化层面,有效的减少了ui层面的工作量
youzan1
2.项目周期中,测试人员较早介入
3.测试用例开发人员辅助添加,开发人员应该是最了解业务逻辑及代码逻辑的,会相对容易挖掘出一些隐藏的业务逻辑、或者异常场景;
4.前期的自动化接口测试,有效保证了项目的提测质量,大大缩减冒烟测试,ui层功能测试时间
5.线上监控开发、安全扫描、性能测试能够有效的测出有些手工测试无法达到的测试场景
6.持续集成平台实现了可流程化配置业务应用发布顺序并与测试自动化相结合的工作流,同时提供自动运行及外部触发的运行模式
youzan2
7.测试质量报告及风险评估,可以起到在迭代中加强对某部分功能的关注

testng套件测试

测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合。在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征。这也允许灵活的配置要运行的测试。套件可以包含一个或多个测试和被定义由标签。 
testng.xml中有根标签。它描述了一个测试套件,这反过来又是由多个区段组成。 
下表列出了所有的可接受合法属性。 
属性:name 描述:此套件的名称。这是一个强制性的属性。 
属性:verbose 描述:这个运行级别或冗长。 
属性:parallel 描述:由TestNG 运行不同的线程来运行此套件。 
属性:thread-count 描述:使用的线程数,如果启用并行模式(忽略其他方式)。 
属性:annotations 描述:在测试中使用注释的类型。 
属性:time-out 描述:默认的超时时间,将用于本次测试中发现的所有测试方法。 
以下例子为有两个Test1 & Test2测试类一起运行测试套件。

创建一个类
创建一个Java类进行测试 MessageUtil.java 在 C:\ > JUNIT_WORKSPACE
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
// Constructor
// @param message to be printed
public MessageUtil(String message) {
this.message = message;
}
// prints the message
public String printMessage() {
System.out.println(message);
return message;
}
// add “Hi!” to the message
public String salutationMessage() {
message = “Hi!” + message;
System.out.println(message);
return message;
} }

创建测试用例类
创建一个Java类文件名 Test1.java 在C:\ > TestNG_WORKSPACE
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = “Manisha”;
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println(“Inside testPrintMessage()”);
Assert.assertEquals(message, messageUtil.printMessage());
} }

创建一个Java类文件名 Test2.java 在C:\ > TestNG_WORKSPACE import org.testng.Assert; 
import org.testng.annotations.Test;  
public class Test2 { 
    String message = “Manisha”; 
 
    MessageUtil messageUtil = new MessageUtil(message);  
  
    @Test 
    public void testSalutationMessage() { 
        System.out.println(“Inside testSalutationMessage()”);        
 message = “Hi!” + “Manisha”; 
        Assert.assertEquals(message,messageUtil.salutationMessage());     
} } 

写入testng.xml 在C:\ > TestNG_WORKSPACE ,将包含标签如下: 
 
 
   
     
 
             
   
 
        
 
             
   
 
   
 
Suite1 包括 exampletest1 和 exampletest2. 

所有Java类编译使用javac。 
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java 
现在运行 testng.xml,将运行提供的测试用例类中定义的测试用例。 
C:\TestNG_WORKSPACE>java -cp “C:\TestNG_WORKSPACE” org.testng.TestNG testng.xml 
验证输出。 
Inside testPrintMessage() Manisha 
Inside testSalutationMessage() Hi!Manisha 
=============================================== Suite1 
Total tests run: 2, Failures: 0, Skips: 0 =============================================== 
您也可以检查测试输出文件夹;下Suite1文件夹中,可以看到两个HTML创建的exampletest1.html 和 exampletest2.html 

testNG注解

1. TestNG的基本注解

@BeforeSuite 注解的方法将只运行一次,运行所有测试前此套件中。
@AfterSuite 注解的方法将只运行一次此套件中的所有测试都运行之后。
@BeforeClass 注解的方法将只运行一次先行先试在当前类中的方法调用。
@AfterClass 注解的方法将只运行一次后已经运行在当前类中的所有测试方法。
@BeforeTest 注解的方法将被运行之前的任何测试方法属于内部类的 标签的运行。
@AfterTest 注解的方法将被运行后,所有的测试方法,属于内部类的标签的运行。
@BeforeGroups 组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。
@AfterGroups 组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。
@BeforeMethod 注解的方法将每个测试方法之前运行。
@AfterMethod 被注释的方法将被运行后,每个测试方法。
@DataProvider 标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方法的参数列表中可以分配。
该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。
@Factory 作为一个工厂,返回TestNG的测试类的对象将被用于标记的方法。该方法必须返回Object[]。
@Listeners 定义一个测试类的监听器。
@Parameters 介绍如何将参数传递给@Test方法。
@Test 标记一个类或方法作为测试的一部分。

2.注解实例

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;

public class TestngAnnotation {
// test case 1
@Test
public void testCase1() {
System.out.println(“in test case 1”);
}

// test case 2
@Test
public void testCase2() {
System.out.println(“in test case 2”);
}

@BeforeMethod
public void beforeMethod() {
System.out.println(“in beforeMethod”);
}

@AfterMethod
public void afterMethod() {
System.out.println(“in afterMethod”);
}

@BeforeClass
public void beforeClass() {
System.out.println(“in beforeClass”);
}

@AfterClass
public void afterClass() {
System.out.println(“in afterClass”);
}

@BeforeTest
public void beforeTest() {
System.out.println(“in beforeTest”);
}

@AfterTest
public void afterTest() {
System.out.println(“in afterTest”);
}

@BeforeSuite
public void beforeSuite() {
System.out.println(“in beforeSuite”);
}

@AfterSuite
public void afterSuite() {
System.out.println(“in afterSuite”);
}

}

接下来,让我们创建的文件 testng.xml 在 C:\ > TestNG_WORKSPACE 执行注解。









testng简单介绍

1.打开Eclipse   Help ->Install New Software ,   然后Add   “http://beust.com/eclipse
1
2.TestNG最简单的测试

下面是TestNG的最简单的一个例子

package TankLearn2.Learn;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.testng.annotations.Test;

public class TestNGLearn1 {

@BeforeClass
public void beforeClass() {
System.out.println(“this is before class”);
}

@Test
public void TestNgLearn() {
System.out.println(“this is TestNG test case”);
}

@AfterClass
public void afterClass() {
System.out.println(“this is after class”);
}
}

3.testng如何执行

直接执行:右键要执行的方法,  点Run As ->TestNG Test

2

4.testng异常测试
测试中,有时候我们期望某些代码抛出异常。

TestNG通过@Test(expectedExceptions) 来判断期待的异常, 并且判断Error Message
package TankLearn2.Learn;

import org.testng.annotations.Test;

public class ExceptionTest {

@Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp=”NullPoint”)
public void testException(){
throw new IllegalArgumentException(“NullPoint”);
}
}

5.testng组测试
testNG中可以把测试用例分组,这样可以按组来执行测试用例比如:
package TankLearn2.Learn;

import org.testng.annotations.Test;

public class GroupTest {

@Test(groups = {“systemtest”})
public void testLogin(){
System.out.println(“this is test login”);
}

@Test(groups = {“functiontest”})
public void testOpenPage(){
System.out.println(“this is test Open Page”);
}
}
然后在testng.xml中 按组执行测试用例










6.testng参数测试
通过DataProvider传递参数
package TankLearn2.Learn;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderLearn {

@DataProvider(name=”user”)
public Object[][] Users(){
return new Object[][]{
{“root”,”passowrd”},
{“cnblogs.com”, “tankxiao”},
{“tank”,”xiao”}
};
}

@Test(dataProvider=”user”)
public void verifyUser(String userName, String password){
System.out.println(“Username: “+ userName + ” Password: “+ password);
}
}

7.testng测试报告
测试报告是测试非常重要的部分.

TestNG默认情况下,会生产两种类型的测试报告HTML的和XML的。 测试报告位于 “test-output” 目录下.
2

也可以设置测试报告的内容级别.

verbose=”2″ 标识的就是记录的日志级别,共有0-10的级别,其中0表示无,10表示最详细








接口测试

我们常说的api就是接口的意思,现在常用的web项目,app项目的接口都是基于http请求的,有些系统内部之间调用的接口一般不需要我们测试,这些很多是基于jar包那种类型的接口;

1.接口类型常见的有get,post,put…类型。get类型的接口一般是指获取信息的接口,比如列表查询的功能,点击查询按钮就调用一个get接口,然后把信息返回出来。就是指把内容从服务器拉下来。post类型一般是提交表单的功能,比如注册、上传、发布帖子之类的就是post接口。就是指把内容推到服务器上去。

2.接口测试的流程是:1)测试接口文档。2)根据接口文档编写测试用例(用例编写方法完全可以按照黑盒测试的用例编写规则来编写,如:边界值、正交表等等设计方法)。3)执行测试,查看接口返回的接口数据是否正确,主要检查返回的接口是否和接口文档中定义的一样,还有要检查返回的数据是否和数据库中的保持一致。

3.get型的接口可以直接通过浏览器访问,参数就带在地址的后面以‘?’连接。但是post的就不行了,要用专门的工具来测试,常用的推荐jmeter。

4.post型的接口

首先查看接口文档:
例如:根据接口文档可知,接口实现一个更新用户昵称的功能,由此可以开始设计测试用例。userId和ickName均不为空,测试输入类型,测试更新成功后再数据库中是否同步更新。jemter中操作如下图:

  IMG_1772

  IMG_1773

第一张图片的设置content-type为application/json是因为接口文档中要求如此。如果没要求,可以不用添加HTTP信息头管理器。因为要求的是json格式的传参,所以post的参数要在(图二)body Data中以json格式书写。

敏捷测试思路之初识

最初知道敏捷测试是源于公司采用敏捷开发模式,对于这个模式有了最初的认识,简单的说敏捷测试应该是一套解决方案、一类测试操作与管理的框架、一组实践或由一定顺序的测试活动构成的测试流程。
敏捷测试的特点:
1.更关注被测系统的本身而不是测试文档
2.测试的参与人员不仅仅只是测试人员,而是包含整个团队
3.敏捷测试强调面对面的沟通、协作,强调团队的责任
4.自动化测试在敏捷测试中占有绝对的主导地位

敏捷测试中的关键过程:
在一个sprint中,测试人员的工作内容主要分为五个部分:user story分析、测试用例设计开发、测试执行和分析、测试持续集成、回归测试。这五个部分的工作均要持续到sprint结束,只是启动时刻有早有晚。
1.user story分析工作:敏捷测试是不断确认客户的需求得以圆满实现,因此对用户需求的分析、理解需要一直持续下去,发现有偏差及时纠正,及时设置合理的验收点、测试项。
2.Testcase Develop工作:设计测试用例,完成测试代码的开发、测试数据的准备,并及时与开发人员沟通软件接口,确保测试代码能够成功驱动业务代码
3.Testing & Analysing工作:执行测试,统计测试覆盖率,分析测试结果,若发现bug,及时沟通,并协助定位bug。
4.Continuous Integration工作:将测试代码进行集成,以保证当前功能若被后续集成代码污染是能够及时得到报警,不断地完善软件产品的功能基线
5.RegressionTesting工作:在完成全部user story后,对所有代码进行完整的回归测试,对所有bug修复情况进行确认。