从0开始学习接口自动化测试(三)

感兴趣的小伙伴可以加入QQ群:556029945

仓储部分开发

?和数据库交互,涉及到数据源的配置,为了小伙伴测试方便,这里采用H2数据库,以免有的小伙伴把代码写完了,却还要单独去安装如mysql,oracle的数据库,还要去写sql建表格,包括分享给他人都觉得不方便,以至于分外麻烦,这里我们就采用内存数据库,即启即用。

?1. 在pom中再次添加相关的依赖

    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
      <version>1.4.197</version>
    </dependency>

?2. 通过/resource/applicantion.yml去配置数据源。

spring:
  datasource:
    type: org.springframework.jdbc.datasource.SimpleDriverDataSource
    url: jdbc:h2:mem:personal_infos;MODE=Mysql;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    password: sa
    username: sa

?3. 定义仓储接口与实现类

package com.dsh.rest.repository;

import com.dsh.rest.api.Profile;

public interface ProfileRepository {

  String addProfile(Profile profile);
  Profile query(String name);

}
package com.dsh.rest.repository.impl;

import com.dsh.rest.api.Contact;
import com.dsh.rest.api.Profile;
import com.dsh.rest.repository.ProfileRepository;
import com.dsh.rest.repository.entity.ProfilePO;
import com.dsh.rest.utils.Dates;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

@Repository
public class ProfileRepositoryImpl implements ProfileRepository {

  private static final String TABLE_NAME = "PROFILE";
  private static final String CULUMNS = "ID,NAME,AGE,BIRTHDAY,MARRIAGE_STATUS,PHONE_NUMBER,ADDRESS,INTRODUCTION,EMAIL,EMERGENCY_CONTACT,EMERGENCY_PHONE_NUMBER,EMERGENCY_ADDRESS";

  private JdbcTemplate jdbcTemplate;

  @Autowired
  DataSource dataSource;

  @Autowired
  public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
    this.jdbcTemplate = jdbcTemplate;
    jdbcTemplate.setDataSource(dataSource);
  }

  @Override
  public String addProfile(Profile profile) {
    String sql = "INSERT INTO " + TABLE_NAME + "("+CULUMNS+") VALUES (?,?,?"+",?,?,?"+",?,?,?,"+"?,?,?)";
    double randomNum = Math.random() * 1000 * 1000;
    String id = String.valueOf(Math.round(randomNum));
    ProfilePO profilePO = getProfilePO(profile);
    Object[] args = new Object[]{
        id,
        profilePO.getName(),
        profilePO.getAge(),
        profilePO.getBirthday(),
        profilePO.getMarriageStatus(),
        profilePO.getPhoneNumber(),
        profilePO.getAddress(),
        profilePO.getSelfIntroduction(),
        profilePO.getEmail(),
        profilePO.getEmergencyContact(),
        profilePO.getEmergencyContactPhoneNumber(),
        profilePO.getEmergencyContactAddress()
    };
    int[] types = new int[]{
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.DATE,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR,
        Types.VARCHAR
    };
    jdbcTemplate.update(sql,args,types);

    return id;
  }

  @Override
  public Profile query(String name) {
    String sql = "SELECT * FROM " + TABLE_NAME+" WHERE NAME= ?";
    Object[] args = new Object[]{
        name,
    };
    int[] types = new int[]{
        Types.VARCHAR,
    };
    List<Profile> profiles = jdbcTemplate.query(sql,args,types,new MyselfInfoRowMapper());
    if (!profiles.isEmpty()){
      return profiles.get(0);
    }
    return null;
  }

  public JdbcTemplate getJdbcTemplate() {
    return jdbcTemplate;
  }

  class MyselfInfoRowMapper implements RowMapper<Profile> {
    @Override
    public Profile mapRow(ResultSet resultSet, int i) throws SQLException {
      Profile profile = new Profile();
      profile.setId(resultSet.getString("ID"));
      profile.setName(resultSet.getString("NAME"));
      profile.setAge(resultSet.getString("AGE"));
      Date birthday = resultSet.getDate("BIRTHDAY");
      profile.setBirthday(Dates.dateToStr(birthday));
      profile.setSelfIntroduction(resultSet.getString("INTRODUCTION"));
      profile.setMarriageStatus(resultSet.getString("MARRIAGE_STATUS"));
      Contact contact = new Contact();
      contact.setPhoneNumber(resultSet.getString("PHONE_NUMBER"));
      contact.setAddress(resultSet.getString("ADDRESS"));
      contact.setEmail(resultSet.getString("EMAIL"));
      contact.setEmergencyContact(resultSet.getString("EMERGENCY_CONTACT"));
      contact.setEmergencyContactAddress(resultSet.getString("EMERGENCY_ADDRESS"));
      contact.setEmergencyContactPhoneNumber(resultSet.getString("EMERGENCY_PHONE_NUMBER"));
      profile.setContact(contact);
      return profile;
    }
  }

  private ProfilePO getProfilePO(Profile profile) {
    ProfilePO profilePO = new ProfilePO();
    profilePO.setName(profile.getName());
    profilePO.setAge(profile.getAge());
    profilePO.setBirthday(Dates.strToSimpleDate(profile.getBirthday()));
    profilePO.setMarriageStatus(profile.getMarriageStatus());
    profilePO.setSelfIntroduction(profile.getSelfIntroduction());
    Contact contact = profile.getContact();
    if (null != contact){
      profilePO.setPhoneNumber(contact.getPhoneNumber());
      profilePO.setAddress(contact.getAddress());
      profilePO.setEmail(contact.getEmail());
      profilePO.setEmergencyContact(contact.getEmergencyContact());
      profilePO.setEmergencyContactPhoneNumber(contact.getEmergencyContactPhoneNumber());
      profilePO.setEmergencyContactAddress(contact.getEmergencyContactAddress());
    }
    return profilePO;
  }
}

?4. 存入数据库需要一个PO去转换一下

package com.dsh.rest.repository.entity;

import java.util.Date;

public class ProfilePO {

  private String name;
  private String age;
  private Date birthday;
  private String selfIntroduction;
  private String marriageStatus;
  private String phoneNumber;
  private String address;
  private String email;
  private String emergencyContact;
  private String emergencyContactPhoneNumber;
  private String emergencyContactAddress;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAge() {
    return age;
  }

  public void setAge(String age) {
    this.age = age;
  }

  public Date getBirthday() {
    return birthday;
  }

  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }

  public String getSelfIntroduction() {
    return selfIntroduction;
  }

  public void setSelfIntroduction(String selfIntroduction) {
    this.selfIntroduction = selfIntroduction;
  }

  public String getMarriageStatus() {
    return marriageStatus;
  }

  public void setMarriageStatus(String marriageStatus) {
    this.marriageStatus = marriageStatus;
  }

  public String getPhoneNumber() {
    return phoneNumber;
  }

  public void setPhoneNumber(String phoneNumber) {
    this.phoneNumber = phoneNumber;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getEmergencyContact() {
    return emergencyContact;
  }

  public void setEmergencyContact(String emergencyContact) {
    this.emergencyContact = emergencyContact;
  }

  public String getEmergencyContactPhoneNumber() {
    return emergencyContactPhoneNumber;
  }

  public void setEmergencyContactPhoneNumber(String emergencyContactPhoneNumber) {
    this.emergencyContactPhoneNumber = emergencyContactPhoneNumber;
  }

  public String getEmergencyContactAddress() {
    return emergencyContactAddress;
  }

  public void setEmergencyContactAddress(String emergencyContactAddress) {
    this.emergencyContactAddress = emergencyContactAddress;
  }
}

? 5. 配置DataSource

package com.dsh.rest.repository.configuration;

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties({DataSourceProperties.class})
@ComponentScan(basePackageClasses = DataSourceConfig.class)
public class DataSourceConfig {

  @Autowired
  DataSourceProperties dataBaseProperties;

  @Bean(destroyMethod = "close")
  public DataSource dataSource(){
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder
        .create()
        .driverClassName(dataBaseProperties.getDriverClassName())
        .url(dataBaseProperties.getUrl())
        .username(dataBaseProperties.getUsername())
        .password(dataBaseProperties.getPassword());
    return dataSourceBuilder.build();
  }

}

? 6. 提供一个工具类方法

public static String dateToStr(Date date) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    return simpleDateFormat.format(date);
  }

? 7. 覆盖一下spring.factories,新建在/resource/META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.dsh.rest.repository.configuration.DataSourceConfig

?8. 在项目根目录下新建一个类如下:

package com.dsh.rest;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import com.google.common.collect.Lists;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.springframework.web.servlet.DispatcherServlet;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
    DruidDataSourceAutoConfigure.class, QuartzAutoConfiguration.class})
public class BootApplication {

  /* public static void main(String[] args) {
     SpringApplication.run(BootApplication.class, args);
   }
 */
  private ApplicationContext applicationContext;

  public void boot(String[] args) {
    List<Resource> resources = Lists.newArrayList();
    resources.add(new ClassPathResource("table.sql"));
    applicationContext = SpringApplication.run(BootApplication.class, args);
    DataSource dataSource = applicationContext.getBean(DataSource.class);
    ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
    populator.setScripts(resources.toArray(new ClassPathResource[]{}));
    populator.execute(dataSource);
  }

  public static void main(String[] args) {
    BootApplication appTest = new BootApplication();
    appTest.boot(args);
  }

  @Bean
  ServletWebServerFactory servletWebServerFactory() {
    return new TomcatServletWebServerFactory();
  }

  @Bean
  public ServletRegistrationBean regRestServlet(DispatcherServlet dispatcherServlet) {
    ServletRegistrationBean registrationBean = new ServletRegistrationBean(dispatcherServlet);
    registrationBean.addUrlMappings("/*");
    return registrationBean;
  }
}

原文地址:https://www.cnblogs.com/xixi0203/p/10647780.html

时间: 2024-10-11 23:51:19

从0开始学习接口自动化测试(三)的相关文章

接口自动化测试(三)

一. 定义公共的请求方法 如下图所示,同一个模块,只是请求数据和返回数据不同,http请求的发送过程是完全相同的 对于不同模块,只是请求的url.请求方法.请求数据和返回数据不同,http请求的过程也是完全相同的 这样就可以将发送请求的方法写成一个类或函数,供不同的测试用例调用 具体的实现是 import requests class MyRequests: def send_request(self, method, url, **kwargs): res = requests.request

Redis3.0.5学习笔记(三)JavaApi操作Redis

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1710783

python接口自动化测试(三)-requests.post()

上一节介绍了  requests.get()  方法的基本使用,本节介绍  requests.post()  方法的使用: 本文目录: 一.方法定义 二.post方法简单使用 1.带数据的post 2.带header的post 3.带json的post 4.带参数的post 5.普通文件上传 6.定制化文件上传 7.多文件上传 一.方法定义: 1.到官方文档去了下requests.post()方法的定义,如下: 2.源码: 3.常用返回信息: 二.post方法简单使用: 1.带数据的post:

python接口自动化测试三:代码发送HTTP请求

get请求: 1.get请求(无参数): 2.get请求(带参数): 接口地址:http://japi.juhe.cn/qqevaluate/qq 返回格式:json 请求方式:get post 请求示例:http://japi.juhe.cn/qqevaluate/qq?key=您申请的appKey&qq=295424589 接口备注:根据传入的参数 qq 号码和您申请的 appKey 测试 qq 的吉凶 请求参数说明(入参) : 名称    必填    类型      说明 key    

HBase-1.0.1学习笔记汇总

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. HBase-1.0.1学习笔记(一)集群搭建 http://luchunli.blog.51cto.com/2368057/1682049HBase-1.0.1学习笔记(二)客户端访问 http://luchunli.blog.51cto.com/2368057/1687458 HBase-1.0.1学习笔记(三)启动脚本解析 http://luchunli.blog.51cto.com/2368057/1690619 HBas

APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例

转载自:http://www.cnblogs.com/findyou/p/5388853.html 说明,本文为学习参考,将于一段时间后删除. 前言    前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相关). 目录 3.1 HTTP接口(GET)测试实例 3.1.1 待测接口说明 3.1.2 新建JAVA工程 1.工程目录说明 2.Common.java源码

【三】Jmeter接口自动化测试系列之Http接口自动化实战

作者:大虫 本文介绍 Jmeter 工具的 http 接口 自动化测试 实战! 为了通用性,就拿知乎 网站作为实战例子吧! 必备技能:http接口基础知识.抓包,本文不做详细介绍,不会的可以先百度恶补! 首先,我们把 知乎登录的包抓下来: 我们抓一下 获取 Jmeter 对应脚本如下: 获取发现栏目脚本: 使用正则表达提取器,提取栏目内容(what?不会正则表达式?找百度) 使用 foreach 控制器将提取结果合并到一个字符串 打印结果: 运行结果: 在进行http 接口测试的时候,通常需要注

【python3+request】python3+requests接口自动化测试框架实例详解教程

转自:https://my.oschina.net/u/3041656/blog/820023 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,

美团接口自动化测试实践

一.概述 1.1 接口自动化概述 众所周知,接口自动化测试有着如下特点: 低投入,高产出. 比较容易实现自动化. 和UI自动化测试相比更加稳定. 如何做好一个接口自动化测试项目呢? 我认为,一个"好的"自动化测试项目,需要从"时间"."人力"."收益"这三个方面出发,做好"取舍". 不能由于被测系统发生一些变更,就导致花费了几个小时的自动化脚本无法执行.同时,我们需要看到"收益",不能为