模拟业务最小测试用例02

Oracle数据库对很多开发人员而言,基本就只是一个存储数据的仓库,只不过这个仓库功能非常强大,额外提供了很多好用的功能,需要的时候会用就好,不会纠结于某个细节。而对很多DBA而言,正好相反,喜欢沉溺于某些细节上,对某些小知识点对应的原理理解的非常透彻,但却往往很少会站在开发层面认识Oracle。

本文旨在构造一份相对较全面的测试数据,对开发常用的对象都模拟创建一份测试用例,DBA就可以直接拿去做一些基本测试。

环境:Oracle 11.2.0.4

  • 1.初始化测试数据
  • 2.清空测试数据

1.初始化测试数据

初始化测试数据的脚本主要包含了如下内容:

  • 1.表空间创建
  • 2.用户创建及赋权
  • 3.表创建
  • 4.索引创建
  • 5.视图、同义词、序列、dblink
  • 6.存储过程、函数、包、定时任务、触发器

脚本:initData.sh

#!/bin/bash
#name:initData.sh
#function:to initial data for test.
#usage: oracle用户登录,执行 sh initData.sh > /tmp/initData.log

#logon database
sqlplus -S / as sysdba <<EOF

prompt ============================
prompt ==  summary
prompt ============================
prompt
prompt 1.表空间创建
prompt 2.用户创建及赋权
prompt 3.表创建
prompt 4.索引创建
prompt 5.视图、同义词、序列、dblink
prompt 6.存储过程、函数、包、定时任务、触发器
prompt

prompt ============================
prompt == 1.表空间创建
prompt ============================
prompt Tablespace:DBS_D_JINGYU
prompt Tablespace:DBS_I_JINGYU
prompt TEMPORARY Tablespace:TEMP_JINGYU
prompt
-- 数据表空间
create tablespace dbs_d_jingyu datafile size 30M autoextend on maxsize 500M;
-- 临时表空间
create temporary tablespace temp_jingyu tempfile size 30M autoextend on maxsize 500M;
-- 索引表空间(可选)
create tablespace dbs_i_jingyu datafile size 30M autoextend on maxsize 500M;

prompt ============================
prompt == 2.用户创建及赋权
prompt ============================
prompt User:jingyu 权限:connect, resource
prompt User:ludan  权限:connect, resource, dba
prompt
-- 假设创建用户 jingyu 密码 jingyu,默认临时表空间 temp_jingyu, 默认数据表空间 dbs_d_jingyu。
CREATE USER jingyu IDENTIFIED BY jingyu
  TEMPORARY TABLESPACE temp_jingyu
  DEFAULT TABLESPACE dbs_d_jingyu
  QUOTA UNLIMITED ON dbs_d_jingyu;

-- 假设创建用户 ludan 密码 ludan,默认临时表空间temp_jingyu, 默认数据表空间 dbs_d_jingyu。
CREATE USER ludan IDENTIFIED BY ludan
  TEMPORARY TABLESPACE temp_jingyu
  DEFAULT TABLESPACE dbs_d_jingyu
  QUOTA UNLIMITED ON dbs_d_jingyu;

-- 赋权
grant resource, connect to jingyu;
grant resource, connect, dba to ludan;

prompt ============================
prompt == 3.表创建
prompt ============================
prompt 

prompt 3.1 普通堆表
prompt ============================
prompt
--3.1 普通堆表
--prepare
conn /as sysdba
alter user scott identified by tiger account unlock;
conn scott/tiger
grant select on emp to jingyu;
grant select on dept to jingyu;

-- 业务用户登录
conn jingyu/jingyu
-- 删除 emp
--drop table emp cascade constraints purge;
--drop table dept cascade constraints purge;
-- 创建emp
create table emp tablespace dbs_d_jingyu as select * from scott.emp;
create table dept tablespace dbs_d_jingyu as select * from scott.dept;
-- 查询T1,T2表数据量
select count(1) from emp;
select count(1) from dept;
-- 创建后面JOB用到的表
create table t_times(col1 date);
create table t_sum(col1 date, col2 number);
create table t_times_old as select * from t_times where 1=2;

-- 业务用户登录
conn ludan/ludan
-- 创建 t_obj
create table t_obj as select * from dba_objects;
-- 查询 数据量
select count(1) from t_obj;

prompt 3.2 分区表
prompt ============================
prompt
--3.2 分区表
conn ludan/ludan
create table t_obj_part
partition by range(CREATED)
(
  partition P2015 values less than (TO_DATE(‘ 2016-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘))
    tablespace dbs_d_jingyu,
  partition P2016 values less than (TO_DATE(‘ 2017-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘))
    tablespace dbs_d_jingyu,
  partition P2017 values less than (TO_DATE(‘ 2018-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘))
    tablespace dbs_d_jingyu,
  partition P2018 values less than (TO_DATE(‘ 2019-01-01 00:00:00‘, ‘SYYYY-MM-DD HH24:MI:SS‘, ‘NLS_CALENDAR=GREGORIAN‘))
    tablespace dbs_d_jingyu
) as select * from t_obj;

select count(1) from t_obj_part partition(P2018);

prompt 3.3 全局临时表
prompt ============================
prompt
--3.3 全局临时表
conn ludan/ludan
create global temporary table t_tmp_session on commit preserve rows as select * from dba_objects where 1 = 2;
create global temporary table t_tmp_transaction on commit delete rows as select * from dba_objects where 1 = 2;

prompt 3.4 索引组织表
prompt ============================
prompt
--3.4 索引组织表
conn jingyu/jingyu
--select dbms_metadata.get_ddl(‘TABLE‘,upper(‘emp‘),‘JINGYU‘) from dual;

CREATE TABLE emp_iot
   (    "EMPNO" NUMBER(4,0),
        "ENAME" VARCHAR2(10),
        "JOB" VARCHAR2(9),
        "MGR" NUMBER(4,0),
        "HIREDATE" DATE,
        "SAL" NUMBER(7,2),
        "COMM" NUMBER(7,2),
        "DEPTNO" NUMBER(2,0),
        primary key(empno)
   )organization index;

insert into emp_iot select * from emp;
commit;

--select * from jingyu.emp where empno = 7788;
--select * from jingyu.emp_iot where empno = 7788;

--select * from jingyu.emp where ename = ‘SCOTT‘;
--select * from jingyu.emp_iot where ename = ‘SCOTT‘;

prompt 3.5 簇表
prompt ============================
prompt
--3.5 簇表
conn jingyu/jingyu

create cluster shc
(cust_id number,
order_dt timestamp SORT)
hashkeys 10000
hash is cust_id
size 8192;

create table cust_orders(
cust_id number,
order_dt timestamp SORT,
order_number number,
username varchar2(30),
ship_addr number,
bill_addr number,
invoice_num number
)
cluster shc(cust_id, order_dt);

--select * from dba_objects where object_name = ‘SHC‘;

prompt 3.6 外部表
prompt ============================
prompt
--3.6 外部表
conn /as sysdba
!mkdir -p /home/oracle/external_table
create or replace directory external_table as ‘/home/oracle/external_table‘;
grant read,write on directory external_table to jingyu;

conn jingyu/jingyu
create table ext_emp (ename,job,sal,dname)
organization external
(type oracle_datapump default directory external_table location(‘ext_emp‘))
as select ename,job,sal,dname from emp join dept on emp.deptno=dept.deptno;

prompt ============================
prompt == 4.索引创建
prompt ============================
prompt 主键、外键、唯一索引、普通索引、位图索引、函数索引
prompt

prompt 4.1 普通B-Tree索引
prompt ============================
prompt
--4.1 普通B-Tree索引
--ludan.idx_t_obj_name
conn ludan/ludan
create index idx_t_obj_name on t_obj(object_name) tablespace dbs_i_jingyu;
--jingyu.empno
conn jingyu/jingyu
create index idx_emp_1 on emp(empno, ename) tablespace dbs_i_jingyu;
create index idx_emp_2 on emp(mgr) tablespace dbs_i_jingyu;

prompt 4.2 唯一索引
prompt ============================
prompt
--4.2 唯一索引
conn ludan/ludan
create unique index ux_t_obj_id on t_obj(object_id) tablespace dbs_i_jingyu;

prompt 4.3 位图索引
prompt ============================
prompt
--4.3 位图索引
conn jingyu/jingyu
create bitmap index bx_emp_job on emp(job) tablespace dbs_i_jingyu;

prompt 4.4 函数索引
prompt ============================
prompt
--4.4 函数索引
conn jingyu/jingyu
create index fx_emp_hiredate on emp(to_char(hiredate,‘yyyy-mm-dd‘)) tablespace dbs_i_jingyu;
--select * from jingyu.emp where to_char(hiredate,‘yyyy-mm-dd‘) = ‘1981-11-17‘;

prompt 4.5 主键、外键
prompt ============================
prompt
--4.5 主键、外键
conn jingyu/jingyu
alter table emp add constraint pk_emp_empno primary key(empno);
alter table dept add constraint pk_dept_deptno primary key(deptno);
alter table emp add constraint fk_emp_references_dept foreign key(deptno) references dept(deptno);

prompt ============================
prompt == 5.视图、同义词、序列、dblink
prompt ============================
prompt 视图、同义词、序列、dblink
prompt

prompt 5.1 视图
prompt ============================
prompt
--5.1 视图
conn /as sysdba
grant create view to jingyu;

conn jingyu/jingyu
create view emp_high_sal as select * from emp where sal > 3000;

prompt 5.2 同义词
prompt ============================
prompt
--5.2 同义词
conn ludan/ludan
create synonym s_emp for jingyu.emp;
create synonym s_dept for jingyu.dept;

--public synonym
create public synonym pubic_emp for jingyu.emp;
create public synonym pubic_dept for jingyu.dept;

prompt 5.3 序列
prompt ============================
prompt
--5.3 序列
conn jingyu/jingyu

--drop sequence seq_1;
create sequence seq_1 start with 1 increment by 1;

--drop table t_test_seq purge;
create table t_test_seq(id number, name varchar2(20));
insert into t_test_seq values(seq_1.nextval, ‘jingyu‘);
insert into t_test_seq values(seq_1.nextval, ‘jingyu‘);
insert into t_test_seq values(seq_1.nextval, ‘jingyu‘);
commit;

prompt 5.4 dblink
prompt ============================
prompt
--5.4 dblink
--tnsnames.ora
--JYZHAO =
--  (DESCRIPTION =
--    (ADDRESS = (PROTOCOL = TCP)(HOST = jyrac-scan)(PORT = 1521))
--    (CONNECT_DATA =
--      (SERVER = DEDICATED)
--      (SERVICE_NAME = jyzhao)
--    )
--  )

--connect user
conn ludan/ludan
--private dblink
create database link to_jyzhao_jy connect to jingyu identified by jingyu using ‘JYZHAO‘;
--public dblink
create public database link to_jyzhao_ld connect to ludan identified by ludan using ‘JYZHAO‘;

prompt ============================
prompt == 6.存储过程、函数、包、定时任务、触发器
prompt ============================
prompt 存储过程、函数、包、定时任务
prompt

prompt 6.1 存储过程:
prompt ============================
prompt
--6.1 存储过程:
--功能:可以输入雇员名,新工资,可以修改雇员的工资。
conn jingyu/jingyu
create or replace procedure p_update_sal(v_ename varchar2,v_newsal number) is
    begin
        update emp set sal=v_newsal where ename=v_ename;
        commit;
    end;
/

prompt 6.2 函数:
prompt ============================
prompt
--6.2 函数:
--功能:输入雇员的姓名,返回该雇员的年薪。
conn jingyu/jingyu
create function f_yearSal(empName varchar2) return number is
    yearSal number(7,2);
    begin
        select sal * 12 + nvl(comm,0) * 12 into yearSal from emp where ename=empName;
        return yearSal;
    end;
/

--SQL> 调用函数
--var income number;
--call f_yearSal(‘SCOTT‘) into:income;
--set serveroutput on
--exec dbms_output.put_line(:income);

prompt 6.3 包:
prompt ============================
prompt
--6.3 包
--package
create package pkg_emp is
    procedure p_update_sal(v_ename varchar2,v_newsal number);
    function f_yearSal(empName varchar2) return number;
end;
/

--package body
create or replace package body pkg_emp is
    procedure p_update_sal(v_ename varchar2,v_newsal number) is
        begin
            update emp set sal=v_newsal where ename=v_ename;
            commit;
        end;
    function f_yearSal(empName varchar2) return number is
        yearSal number(7,2);
        begin
            select sal * 12 + nvl(comm,0) * 12 into yearSal from emp where ename=empName;
            return yearSal;
        end;
    end;
/

--调用包中的过程:
--call pkg_emp.p_update_sal(‘SMITH‘,133);
--调用包中的函数:
--var abc number
--call pkg_emp.f_yearSal(‘SMITH‘) into:abc;

prompt 6.4 JOB:
prompt ============================
prompt
--6.4 JOB
--select OWNER, JOB_NAME, JOB_STYLE, JOB_TYPE, STATE from DBA_SCHEDULER_JOBS;
--select JOB_NAME, JOB_STYLE, JOB_TYPE, STATE from USER_SCHEDULER_JOBS;
conn ludan/ludan

--作业功能:每秒向T_TIMES表插入当前系统时间,运行1w次后终止。
BEGIN
sys.dbms_scheduler.create_job(
job_name => ‘"JINGYU"."J_INSERT"‘,
job_type => ‘PLSQL_BLOCK‘,
job_action => ‘begin
  -- Insert PL/SQL code here
  insert into t_times values(sysdate);
  commit;
end;‘,
repeat_interval => ‘FREQ=SECONDLY‘,
start_date => to_timestamp_tz(‘2015-12-09 05:05:00 Asia/Shanghai‘, ‘YYYY-MM-DD HH24:MI:SS TZR‘),
job_class => ‘"DEFAULT_JOB_CLASS"‘,
comments => ‘Insert the current date into the T_TIMES table.‘,
auto_drop => FALSE,
enabled => FALSE);
sys.dbms_scheduler.set_attribute( name => ‘"JINGYU"."J_INSERT"‘, attribute => ‘max_runs‘, value => 10000);
END;
/

--ENABLE(启动作业)
exec dbms_scheduler.enable(‘"JINGYU"."J_INSERT"‘);
--DISABLE(禁用作业)
--exec dbms_scheduler.disable(‘"JINGYU"."J_INSERT"‘);
--DROP_JOB(删除作业)
--exec dbms_scheduler.drop_job(‘"J_INSERT"‘);

prompt 6.5 触发器:
prompt ============================
prompt
--6.5 Trigger
conn jingyu/jingyu
--功能:只要有更新emp表的操作,就会记录sal字段的变化。
--drop table aud_salary_history;
create table aud_salary_history(
empno NUMBER(4),
old_sal NUMBER(7,2),
new_sal NUMBER(7,2),
change_time varchar2(50)
);

create or replace trigger tri_sal after update
on emp
    for each row
begin
    insert into aud_salary_history VALUES
  (:OLD.empno, :OLD.sal, :NEW.sal, TO_CHAR(SYSDATE, ‘yyyy-mm-dd hh24:mi:ss‘));
end;
/

--update emp set sal = 1000 where empno=7369;
--select * from aud_salary_history;
--rollback;

prompt ============================
prompt ===initData Completed!!!====
prompt ============================

EOF

2.清空测试数据

清空测试数据的脚本主要包含如下内容:

  • 1.删除用户
  • 2.删除表空间
  • 3.删除public对象

脚本:delData.sh

#!/bin/bash
#name:delData.sh
#function:to delete data for test.
#usage: oracle用户登录,执行 sh delData.sh > /tmp/delData.log

#logon database
sqlplus -S / as sysdba <<EOF

prompt ============================
prompt == 1.Drop User
prompt ============================
prompt
--drop user
--select s.username, s.sid, s.serial#, p.spid from v$session s, v$process p where s.paddr = p.addr and s.username = ‘JINGYU‘;
select s.username, s.sid, s.serial#, p.spid from v\$session s, v\$process p where s.paddr = p.addr and s.username is not null;
drop user ludan cascade;
drop user jingyu cascade;

prompt ============================
prompt == 2.Drop Tablespace
prompt ============================
prompt
--drop tablespace
drop tablespace dbs_d_jingyu including contents and datafiles;
drop tablespace dbs_i_jingyu including contents and datafiles;
drop tablespace temp_jingyu including contents and datafiles;

prompt ============================
prompt == 3.Drop Public Objects
prompt ============================
prompt
--public dblink
select dbms_metadata.get_ddl(‘DB_LINK‘,DB_LINK,‘PUBLIC‘) FROM DBA_DB_LINKS where owner=‘PUBLIC‘;
drop public database link TO_JYZHAO_LD;
select dbms_metadata.get_ddl(‘DB_LINK‘,DB_LINK,‘PUBLIC‘) FROM DBA_DB_LINKS where owner=‘PUBLIC‘;

--public synonym
SELECT DBMS_METADATA.GET_DDL(‘SYNONYM‘,a.SYNONYM_NAME,a.owner) FROM DBA_SYNONYMS a where a.owner =‘PUBLIC‘ and table_owner in (‘JINGYU‘,‘LUDAN‘);
drop public synonym PUBIC_DEPT;
drop public synonym PUBIC_EMP;
SELECT DBMS_METADATA.GET_DDL(‘SYNONYM‘,a.SYNONYM_NAME,a.owner) FROM DBA_SYNONYMS a where a.owner =‘PUBLIC‘ and table_owner in (‘JINGYU‘,‘LUDAN‘);

--external tables
select * from dba_external_tables;
--外部表会随用户被删除而删除,但外部表真实的文件还在,需要删除掉(rm命令危险,故注释掉手工执行):
--!rm -rf /home/oracle/external_table

prompt ============================
prompt ===delData Completed!!!====
prompt ============================

EOF

原文地址:https://www.cnblogs.com/jyzhao/p/9038472.html

时间: 2024-10-11 07:17:55

模拟业务最小测试用例02的相关文章

zabbix通过php脚本模拟业务访问redis验证nosql的可用性

背景: redis通过shell脚本进行监控,没有问题,应用报警连不上redis,此时需要通过php模拟web环境进行redis的操作来确认web服务器是否能正常和redis通信 1.配置nginx,让监控redis的php脚本能通过url访问到redis # nginx.conf的配置修改 location ~ ^/php { root /data/www/html; location ~ php(.+\.php)(.*)$ { fastcgi_pass unix:/tmp/php-cgi.s

Oracle RAC 更换存储实验

实验环境准备:RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DATA使用的是DATA1磁盘组,底层对应的是3个5G大小的共享LUN,外部冗余: FRA使用的是FRA1磁盘组,底层对应的是1个5G大小的共享LUN,外部冗余: 额外添加7个共享LUN(3个1G大小,4个5G大小),用来模拟新的存储映射出来的共享LUN: 我这里是使用Oracle VM VirtualB

OGG学习笔记02

实验环境:源端:192.168.1.30,Oracle 10.2.0.5 单实例目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1.模拟源数据库业务持续运行 2.配置OGG前期准备 3.配置OGG单向复制 1.模拟源数据库业务持续运行 OGG的单向配置比较简单,但实际生产过程很多业务要求不间断运行,所以我创建了2张模拟业务表,简单模拟在业务不间断运行场景下OGG的配置. 1.1 创建模拟的业务用户 首先我创建业务用户jy,并指定密码,赋予基本业务用户的角色权限. --u

POJ 3784 Running Median (最大最小堆)

最大最小堆动态求中位数 题意:输入M个数,当已输入的个数为奇数个时输出此时的中位数. 一共有M/2+1个中位数要输出,每一行10个. 分析: 用两个优先队列来模拟最大最小堆.中位数是x,就是有一半数比x小,一半数比x大. 刚好符合堆的特点. 用一个从大到小排序的优先队列q1来模拟小于x的数. 从小到大排序的优先队列q2来模拟大于x的数. 动态维护两个优先队列的元素个数.q1.size()=q2.size() 输入的数为偶数个时, q1.size()=q2.size()+1 输入的数为奇数个时.

测试用例规范v2.0

1.引言 软件测试规范的编写是为了给测试人员在测试用例编写的过程中提供一个指导. 测试目的 测试是软件交付用户使用前一个不可缺少的环节,它存在的目的有四个:1)找到尽可能多的找到系统中的bug:2)关注用户的需求:3)根据测试最终结果分析和评估软件的质量风险:4)找到软件开发过程中的缺陷.具体内容可以上网查询. 2.了解业务 写测试用例前要了解这个系统的业务逻辑,将系统到各个子系统模块进行细化,从宏观到微观,从同级关系,上下级关系以及各系统间的接口交互进行了解. 就和看目录一样,先看所有的大标题

1.5如何编写测试用例

1.测试用例定义 描述每一个测试点的数据设计和步骤设计叫测试用例 2.重要性 软件测试核心,工作的基本 评估测试结果的基准 保证测试时不遗漏测试的功能点 对系统架构或者业务流程深入了解 方便测试用例评审 3.测试用例组成 3.1.用例编号 如:产品名-测试阶段-测试项-测试子项-xxx 3.2.测试项目:对应一个功能模块 3.3.测试标题:输入内容加结果,标题不能重复 3.4.重要级别:高/中/低 3.5.预置条件:前提条件 3.6.测试输入:需要加工的输入信息,根据具体情况来设计(跟步骤结合起

源码学习(一)——模拟Spring MVC

1.准备 1.1创建项maven项目,目录如下 1.2 导包 servlet-api: 模拟springmvc采用的是对同一个servlet进行处理 fastjson: JSONObject 是阿里自己封装的一个map,本人习惯使用,非必需 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

ConcurrentLinkedQueue 模拟火车售票过程

火车票类 public class Ticket { private String NO; // 车票编号 private double price; // 票价 public Ticket(String nO, double price) { super(); NO = nO; this.price = price; } public String getNO() { return NO; } public void setNO(String nO) { NO = nO; } public d

基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可以再优化一下,即存入订单的时候就算出订单的过期时间插入数据库,设置定时任务查询数据库的时候就只需要查询过期了的订单,然后再做其他的业务操作 jdk延迟队列 DelayQueue 采取jdk自带的延迟队列能很好的优化传统的处理方案,但是该方案的弊.端也是非常致命的,所有的消息数据都是存于内存之中,一旦