金三银四跳槽高峰,拿10K还是20K,谁说了算?

不知不觉,“金三银四”跳槽季已经接近尾声。在这求职市场混迹了一圈,身边很多测试同行开始讨论薪资的声音也愈发大了起来。

工作年限不短,项目经验也不少

  • 测试人要涨薪该往哪些方面努力?
  • 面试时哪些点可让自己“升值”?

最后的冲刺节点,还在犹豫的测试人要靠什么跻身进高薪人才列队,坐上金三银四的涨薪车。

那么,问题来了,做软件测试如何可以达到月薪20k呢?

不同背景和能力的人明显是不一样的,如果你是名校研究生或者技术能力比较强的本科生,刚毕业可以进入阿里,腾讯,字节这类的大厂,20k一毕业就达到了。

如果你学历背景普通,也没能一开始就进入特别知名的一线大厂,那么达到月薪20k还是需要一些时间的。

小公司的话需要做到技术主管,经理之类的职位,大公司从事技术岗位需要达到一定的技术水平。

前者抛开先不谈,后者的话需要掌握哪些技能以及达到什么能力呢?

首先我觉得除了极强的业务能力之外,至少在自动化和性能测试方面做到一种专精的程度。性能就包括熟练掌握jmeter工具,编写脚本,压测,会对linux服务器硬件,中间件,数据库做监控,以及会分析性能瓶颈,定位调优。

自动化需要至少熟练掌握一种自动化的测试框架搭建,可以满足公司业务需求,减少回归测试工作量,极大提升效能。首先推荐大家学习接口自动化。

当然,万丈高楼平地起,不管是自动化还是性能测试,首先需要掌握的就是接口测试。不管是接口自动化还是性能压测都是建立在接口测试的基础之上的。可以说接口测试是你成为中高级测试工程师的第一个拦路虎。

在日常的测试工作中,接口测试其实很普遍。那么为什么需要做接口测试呢?

接口测试的目的第一,就是测试可以提前介入测试,因为公司中一般接口都是比页面优先提测的。尽早介入就可以减少风险。

其次,接口测试可以发现页面测试发现不了的bug。比如,有些人可以通过抓包的方式,绕过前端,直接对接口发起请求。

如果接口不做校验的话,就可能篡改数据,尤其涉及金钱之类的,导致重大损失。当公司业务逐渐趋于稳定之后,一般会做接口自动化,来减少回归测试工作量。这个时候,公司团队中技术能力强的就会进行技术选型,软件架构,搭建自动化测试框架。

技术差一些的,就只能做一些编写自动化测试用例边边角角的工作。当然,结果就是两者的薪水待遇天差地别。

所以,强烈推荐大家一定要学习编程,学会搭建接口自动化测试框架,下面教大家接口自动化测试框架搭建

一、原理及特点

参数放在XML文件中进行管理
用httpClient简单封装一个httpUtils工具类
测试用例管理使用了testNg管理,使用了TestNG参数化测试,通过xml文件来执行case。
测试报告这里用到第三方的包ReportNG 项目组织用Maven

二、准备

使用工具:eclipse,maven
用到的第三方jar包:dom4j、reportng、testng
理解难点:httpUtils和xmlUtil工具类的封装;dom4j使用;CookieStore的应用

三、框架构思

1、项目结构
金三银四跳槽高峰,拿10K还是20K,谁说了算?
2、用例执行流程
金三银四跳槽高峰,拿10K还是20K,谁说了算?
3、接口调用流程
金三银四跳槽高峰,拿10K还是20K,谁说了算?
4、调度脚本流程
金三银四跳槽高峰,拿10K还是20K,谁说了算?

四、框架实现

1、输入参数

1.1 参数放在XML文件中进行管理

例:这里测试获取角色的接口输入参数为,page和rows,mapRole.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>
<map>
	<bean beanName="GetRole">
		<!--Locator lists -->
		<locator name="page" value="1"></locator>
		<locator name="rows" value="10"></locator>
	</bean>
</map>

1.2 封装一个xmlUtil工具类负责读取XML,使用第三方的jar包dom4j

1.2.1 xmlUtil中readXMLDocument方法返回值为HashMap<String, String>

public static HashMap<String, String>  readXMLDocument(String beanName,String xmlName){
    
}

参数xmlName(xml文件的名字); 参数beanName(xml文件中节点的名称);

1.3 封装一个CookieUtil工具类,通过CookieStore储存cookie

1.3.1 CookieUtil类中setCookieStore方法返回值为CookieStore

public  CookieStore setCookieStore(HttpResponse httpResponse) {

}

1.4 用httpClient简单封装一个httpUtils工具类有get.post,put,delete方法

1.4.1 httpUtils中post封装方法如下:

public CloseableHttpResponse post(String url, Map<String, String> params,CloseableHttpClient httpclient,CookieStore cookieStore){

}

2、返回参数

2.1 创建一个接口返回对象ResponseBean

对象ResponseBean,包括status、statusCode、contentType、body、url、method、cookies

2.2 在工具类中在创建一个ReponseUtil工具类

ReponseUtil工具类负责将请求的返回数据CloseableHttpResponse 转换成ResponseBean

public ResponseBean setResponseBean(CloseableHttpResponse httpResponse) {

}

3、测试用例

测试用例管理使用了testNg管理 ,使用了TestNG参数化测试,通过xml文件来执行case

3.1 测试case脚本

public class GetRoleTest {
    static CookieStore cookieStore ;
    static CookieUtil cookieUtil=new CookieUtil() ;
    CloseableHttpClient client;
    HttpUtils httpUtils=HttpUtils.getInstance();


    @Parameters({ "url", "objBean" ,"statusCode","xmlName"})
    @BeforeSuite

    /*
    * 登录进入系统获取JSESSIONID放入到CookieStore中
    * */
    public  void TestLoginIn(String url ,String objBean, String statusCode,String xmlName) {

        Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);
        client = HttpClients.createDefault();
        CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);
        //cookieUtil.printResponse(httpResponse);
        cookieStore=cookieUtil.setCookieStore(httpResponse);

    }

    @Parameters({ "url", "objBean" ,"statusCode","body","xmlName"})
    @Test(priority = 2)
    public  void TestGetRole(String url ,String objBean, String statusCode,String body,String xmlName) {
        Map<String,String> params=xmlUtil.readXMLDocument(objBean,xmlName);
        client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
        CloseableHttpResponse httpResponse= httpUtils.post(url, params, client, cookieStore);
        ResponseBean rb=new ReponseUtil().setResponseBean(httpResponse);
//        add Assert
        Assert.assertEquals("OK", rb.getStatus());
        Assert.assertEquals(statusCode, rb.getStatusCode());
        Assert.assertEquals(true, rb.getBody().contains(body));

    }
    @AfterSuite
    public void closeClient(){
        try {
            // 关闭流并释放资源
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • [注] 因为API接口测试时每次都要校验Cookie,所有我们每次都先执行登录操作去获取Cookie

3.2 xml文件的编写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestGetRole" parallel="classes" thread-count="5">
    <parameter name="url" value="/sys/login" />
    <parameter name="objBean" value="loginIn" />
    <parameter name="status" value="OK" />
    <parameter name="statusCode" value="200" />
    <parameter name="xmlName" value="mapRole" />
        <test name="TestGetRole" preserve-order="true">
            <parameter name="url" value="/json/getRoleInfo" />
            <parameter name="objBean" value="GetRole" />
            <parameter name="status" value="OK" />
            <parameter name="statusCode" value="200" />
            <parameter name="body" value="roleName" />
            <classes>
                <class name="com.lc.testScript.GetRoleTest">
                    <methods>
                        <include name="TestGetRole" />
                        <!--<include name="TestGetRole2" />-->
                    </methods>
                </class>
            </classes>
        </test>
</suite>

右键->run as ->TestNG Suite,这个场景的的测试用例就可以运行了

4、测试报告和项目组织

测试报告这里用到第三方的包ReportNG 项目组织用Maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
..........................................
..........................................
..........................................
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <xmlFileName1>TestGetRole.xml</xmlFileName>
.................这里写testNG对应的XML名称----------------------
        <xmlFileName10>TestGetUser.xml</xmlFileName>
    </properties>
    <dependencies>
 ..........................
     </dependencies>   
  <build>

       <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>src/test/java/testSuites/${xmlFileName}</suiteXmlFile>
                        .................略............
                        ..............这里的和properties中的xmlFileName想对应............
                        <suiteXmlFile>src/test/java/testSuites/${xmlFileName10}</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>

      <!-- 添加插件,添加ReportNg的监听器,修改最后的TestNg的报告 -->
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.5</version>
          <configuration>
              <properties>
                  <property>
                      <name>usedefaultlisteners</name>
                      <value>false</value>
                  </property>
                  <property>
                      <name>listener</name>
                      <value>org.uncommons.reportng.HTMLReporter</value>
                  </property>
              </properties>
              <workingDirectory>target/</workingDirectory>
          </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
  • [注] 因为是maven的项目所以要将testSuite的xml文件放在maven的test目录下,这样右键pom.xml文件maven test,所有的测试用例就开始执行了

测试报告

金三银四跳槽高峰,拿10K还是20K,谁说了算?

框架目前存在的不足

  • 数据库数据校验这一块的功能还没有完善,计划用MyBatis
  • 参数使用了xml文件配置虽然灵活但有些繁琐,目前还没想到好的解决方案,testlink是否可以尝试一下呢

就写到这了,希望会对大家有帮助

下面我还整理了一份软件测试工程师发展方向知识架构体系图。
金三银四跳槽高峰,拿10K还是20K,谁说了算?
希望大家能照着这个体系在1-2年内完成这样一个体系的构建。可以说,这个过程会让你痛不欲生,但只要你熬过去了。以后的生活就轻松很多。正所谓万事开头难,只要迈出了第一步,你就已经成功了一半,古人说的好“不积跬步,无以至千里。”等到完成之后再回顾这一段路程的时候,你肯定会感慨良多。

金三银四跳槽高峰,拿10K还是20K,谁说了算?

加油吧,测试员!如果你需要提升规划,那就行动吧,在路上总比在起点观望的要好。

未来的你肯定会感谢现在拼命的自己!

 

上一篇:月薪10k,20k,30k及以上的软件测试工程师分别有何不同?


下一篇:干了5年功能测试,最高月薪10k!不甘现状“我“想赚更多钱