自我介绍:
我叫XX,17年七月份毕业于XX大学XX专业,研究方向是JavaWeb,主要做管理方面的一些网站,包括学生选课系统,学生宿舍管理系统,校医院体检系统,16年11月份到17年的4月份之间在百度搜索公司商业服务质量部网盟团队实习,实习的职位是测试开发,测试网盟的大数据产品中的受众数据管理平台DMP,DMP主要是对人群属性和人群行为进行分析,计算出广告投放的最佳目标人群,帮助广告主选择将广告投放给什么类型的人群,以使广告的投放效果最大化,我的主要的工作内容是做业务测试,写数据源的监控脚本,开发脚本自动化测试工具。毕业之后,我就职于成都卫士通信息产业股份有限公司,职位是Java开发工程师,开发的是网络安全监管与态势感知系统,系统主要是对防火墙、加密解密设备、签名验签系统等100多种网络安全设备的运行服务状态、日志信息、安全事件及策略配置信息等数据进行采集、管理和分析,呈现资产设备、业务服务、安全事件、违规操作等态势,实现对网络安全设备的统一管理,风险监测预警,保证网络设备的完全运行。系统由资产设备管理、拓扑管理、安全事件、知识库、告警预警、策略库、态势感知七个模块组成,我负责开发安全事件模块。我为人乐观开朗、积极向上、责任心强,喜欢羽毛球和乒乓球。
脚本自动化测试工具:
快回学校的时候,其他业务线的同事忙不过来了,正好我懂开发的技术,就让我去帮忙做一些开发的工作,开发的这个测试工具是以脚本自动化测试框架TSS为基础开发的,TSS运行的时候能自动生成配置和模板等一些脚本运行的环境,我做的主要工作就是文件上传,把写好的自动化脚本文件上传;TSS框架运行的时候,会自动生成一些配置,有些配置不是我们需要的,把不需要的配置删除,添加一些自己需要的新配置,修改一些配置;TSS执行完脚本文件,会按照模板生成测试结果,我把测试结果记录下来并生成Excel或者PDF文件,最后把TSS框架在运行过程中对配置、模板的改变清理掉,恢复初始化时候的状态。
项目介绍:
开发的系统是网络安全监管与态势感知系统。系统主要是对防火墙设备、加密解密设备、签名验签系统、数字证书系统等100多种网络安全设备的运行状态、日志信息、服务状态、安全事件和策略配置信息等数据进行采集、分析和管理,呈现资产设备、业务服务、安全事件、违规操作等态势,实现对网络安全设备的统一监管、风险监测预警,保障网络设备的安全运行。系统由前置数据采集系统和监管系统两个子系统组成。前置系统主要是采集网络安全设备的数据,采集数据的方式分为两种:主动上报和被动查询,主动上报是指被监管的网络安全设备按照配置的数据上报周期主动将数据传给前置系统,主动上报方式使用的syslog和webService两种通信协议,被动查询是指前置系统周期性地向被监管的网络安全设备发起数据查询请求,网络安全设备接收到请求后,将数据传输给前置系统。前置系统接收到安全设备的数据之后,会对数据进行拆分、合并、标准化、模型填充等处理,最后转化成json格式的字符串,以byte字节流的形式传递给监管系统。监管系统主要是用springboot和springcloud微服务技术开发的一个系统,该系统由资产设备管理、拓扑管理、安全事件、知识库、告警、预警、策略库、态势感知等八个模块组成,这八个模块是相互独立的,相互之间使用Restful风格的API进行调用,交互通信。资产设备管理模块的功能是对上报数据的安全设备的在线、离线运行状态、设备的磁盘、CPU、内存等性能数据进行呈现;拓扑管理是指把资产设备的在线、离线运行状态、病毒、漏洞、攻击、违规等安全事件以几何拓扑图的形式呈现;安全事件模块是对访问控制、防病毒、入侵检测、主机监控等事件进行分类定级等处理;知识库是安全事件分类定级、资产设备生成告警预警的依据;告警模块和预警模块依据知识库对漏洞、病毒、攻击、违规等事件的判定产生资产设备的告警与预警;策略库为告警和预警的处理提供解决方案,资产设备管理员根据解决方案及自己已有的经验对告警和预警进行处理;态势感知模块主要是对资产设备、安全事件、业务服务、违规操作等概况信息、发展趋势进行全面的呈现。我主要负责开发安全事件模块,主要的工作内容是对前置系统传输过来的byte字节流进行解析,得到json格式的字符串,调用知识库模块相应的API对json字符串进行分类的判断,判断其是访问控制、防病毒、主机监控、入侵检测等事件,将json串转化为对应的领域模型,并进行模型填充处理,存储到Redis缓存和MySQL数据库中。之后编写一些业务逻辑处理相关的代码,主要是对数据库进行CRUD的操作,给前端的同事提供事件分类、事件危险等级、事件趋势等事件管理和安全事件态势相关的交换接口。
用到的springcloud组件有API服务网关zuul、服务注册中心euraka、分布式配置中心config、负载均衡器ribbon、容错保护hystrix。系统的持久化数据库用的是MySQL,ORM框架用的是Mybatis,为了降低数据库访问次数,提高系统响应性能,系统的大部分数据存储在NoSQL数据库Redis中。
微服务:微服务是指把传统的复杂庞大的All In One单体结构的软件系统按照一定的维度比如业务维度拆分成若干个能够独立运行的微服务。每个微服务从开发、测试、运维等都是独立的,包括存储的数据库也都是独立的,自己就有一套完整的流程,完全可以把它当成一个项目来对待,不必依赖于其它模块,每个微服务只需要实现自己的业务逻辑就可以。
微服务优点:
每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。
微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
微服务能使用不同的语言开发。
微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, bamboo 。
微服务易于被一个开发人员理解,修改、维护和扩展。
微服务允许你利用融合最新技术。
易于和第三方集成。
每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
微服务缺点:
对运维要求高。
跟踪问题难。
当服务数量增加,管理复杂性增加。
区块链是指通过去中心化和去信任的方式集体维护一个可靠数据库的技术方案,区块链并不是一种单一的、全新的技术 ,而是多种现有技术
(分布式、密码学)整合的结果。区块链技术使得在线支付能够直接由一方发起并支付给另一方,中间不需要通过任何的金融机构。
区块链是一种块链式数据结构,将一段时间内发生的事务处理以块为单位进行存储,并用密码学算法将区块按时间先后顺序连接成链条的的
一种数据结构。
区块链的类型:公有链、联盟链、私有链
优势和劣势:
优势:在百度实习过,对这里的工作环境比较熟悉;做过测试开发的实习,熟悉测试开发的工作内容;代码能力不错,具有写脚本和开发测试工具的能力;沟通能力强,能够和PM、FE、RD搞好关系,弄懂需求,做好测试计划,设计测试用例;严谨认真有耐心,善于发现问题和解决问题,能够及时发现产品中的错误或是缺陷,协调FE、RD予以解决。
劣势:没做过自动化测试、性能测试,需要学习一些这些;是从开发转测试开发,对产品的业务需要重头学习,如果是刚毕业就做测试开发,这一年的时间,我应该已经掌握了产品的业务了。
开发中遇到的问题:
一、性能问题:展示态势页面时,读取设备的IP很慢
编写态势页面要展示数据的交互接口时,态势页面的数据有的来源于Redis、有的来源于mysql,由于Redis中的数据是存在内存中的key-value、MySQL中的数据是存在磁盘中,这样就导致查询MySQL中的数据相较于查询Redis中的数据有些延迟,延迟是肉眼能够看到的,测试的同事让把延迟降到最低,起码让肉眼看不到。
解决:
二、数据处理延迟:接收到前置系统的数据后,对数据的处理速度较慢
解决:
三、单点登录:
https://www.cnblogs.com/ywlaker/p/6113927.html
解决:
面试技能:
https://www.cnblogs.com/JavaArchitect/p/8249594.html
https://www.cnblogs.com/JavaArchitect/p/9485075.html
https://www.cnblogs.com/JavaArchitect/p/9032323.html
一、百度外卖
1、四个数中选三个组成不同的三位数的个数
package com.mian.demo; public class Waimai1 { public static void main(String[] args) { int[] arr={9,4,1,2}; int res=new Waimai1().getResult(arr); System.out.println(res); } private int getResult(int[] arr){ int size=arr.length; if(size==0||arr==null){ return 0; } int count=0; for(int i=0;ii){ for(int j=0;j j){ for(int k=0;k k){ if(arr[i]!=arr[j]&&arr[j]!=arr[k]&&arr[i]!=arr[k]){ System.out.println(arr[i]+""+arr[j]+""+arr[k]); ++count; } } } } return count; } }
2、两个无序数组合并为一个有序数组并去重
package com.mian.demo; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; public class Waimai2 { public static void main(String[] args) { int[] arr1={0,9,4,2,1,3,2}; int[] arr2={1,3,4,2,1,5,4,2,1}; Waimai2 wm=new Waimai2(); int[] arr=wm.mergeTwoArray(arr1,arr2); wm.printArray(arr); } private int[] mergeTwoArray(int[] arr1,int[] arr2){ int size1=arr1.length; int size2=arr2.length; quickSort(arr1); quickSort(arr2); printArray(arr1); printArray(arr2); int i=0; int j=0; int k=0; int[] arr=new int[size1+size2]; while(isize2){ if(arr1[i]<arr2[j]){ arr[k++]=arr1[i++]; }else{ arr[k++]=arr2[j++]; } } while(i<size1){ arr[k++]=arr1[i++]; } while(j<size2){ arr[k++]=arr2[j++]; } HashSet set=new HashSet<>(); for(Integer num:arr){ set.add(num); } int[] res=new int[set.size()]; Iterator it=set.iterator(); int m=0; while(it.hasNext()){ res[m++]=it.next(); } return res; } private void quickSort(int[] arr){ int size=arr.length; if(size==0||arr==null){ return; } quickSortHelper(arr,0,size-1); } private void quickSortHelper(int[] arr,int low,int high){ int pivot=0; if(low<high){ pivot=partition(arr,low,high); quickSortHelper(arr,low,pivot-1); quickSortHelper(arr,pivot+1,high); } } private int partition(int[] arr,int low,int high){ int pivot=arr[low]; while(low<high){ while(low =pivot){ --high; } arr[low]=arr[high]; while(low pivot){ ++low; } arr[high]=arr[low]; } arr[low]=pivot; return low; } private void printArray(int[] arr){ if(arr.length==0||arr==null){ return; } for(int i=0;i i){ System.out.print(arr[i]+" "); } System.out.println(arr[arr.length-1]); } }
二、链家网
1、讲项目
2、测试中遇到的问题
1)、RD提测晚,占用了测试时间,在上线之前测试不完
测试主要功能点,根据自己的经验把不主要的功能和不容易出错的地方先不测
2)、很多bug,上线之前RD改不完
叫上leader、pm、fe商讨哪些bug是主要的,确定修改bug的优先级顺序,让RD先修改主要的bug
3)、QA认为是bug,RD认为不是
提供足够的证据证明它是bug,它对系统的功能、性能等质量的影响,据理力争,说服RD
发邮件发给RD及其领导,在邮件里清楚的写明一些,侧面试压,
直接找自己的领导和RD的领导
3、合并两个有序链表,设计测试用例
4、A、B、C三个数是否能组成三角形,设计测试用例
5、测试流程
三、每日优鲜
1、集合list、set是否有序
2、数据库索引
https://blog.csdn.net/shanghairuoxiao/article/details/76888423
https://www.cnblogs.com/xidian2014/p/8489079.html
https://www.cnblogs.com/maolong8/p/9452291.html
3、Linux命令
4、优化查询
5、测试接口
接口测试是指测试系统组件间接口,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
http://www.51testing.com/html/46/n-3722746.html
https://www.cnblogs.com/feng0815/p/7509541.html
四、易车网
1、讲项目
2、测试百度登录首页
3、测试流程:
1)、PM对本次迭代的需求功能做MRD,召开需求评审会,QA参加需求评审会,熟悉本次迭代的需求功能,不懂的问题或自己的想法及时提出来;
2)、RD从功能上拆分需求,并给出相应的实现方案,QA针对需求和实现方案设计测试方案,实现上不懂的或自己的建议要及时与RD进行沟通;测试case梳理完毕后,需要与RD、PM对测试用例进行评审(case review),QA根据RD和PM的建议对现有的test case进行调整,以保证本次的迭代的质量;QA给出测试排期(1—2个buff)
3)、RD根据实现方案进行开发,开发完成后会发提测邮件,邮件中会写明DB、配置文件等的一些改动以及RD自测的点;QA搭建测试环境,对RD的提测进行准测试,测试其核心功能是否都覆盖,就是抽取10%—20%的test case进行过准入测试;如果不通过,则将RD的提测邮件打回,通过则发出邮件正式进行测试;
4)、执行测试用例,发现bug则向RD提测,RD修完bug则进行回顾测试。若QA可能存在延期,则每天发出测试进度;
5)、QA测试完毕之后发出上线邮件(sign off邮件),邮件中写明QA的测试点,RD自己保障的功能点,暴露的风险;
6)、RD收到上线邮件后进行上线,PM、QA、RD按照checklist进行线上检查。若没有问题则本次迭代结束。
4、用到的springcloud组件
5、eureka的设计模式
6、斐波那契数列
7、Java8的新特性
五、京东金融
1、冒泡排序
2、mybatis
3、你对测试的理解
测试是软件开发过程中重要的一个环节,尽量在上线之前发现软件的错误、缺陷等,做到风险前置。提高用户体验。测试对测试人员的综合素质要求比较高,特别是沟通表达能力,测试人员需要与FE、PM、RD保持有效的沟通,对每次跌倒的需求了如指掌,然后根据需要设计测试计划、设计测试用例等,执行测试用例的时候要耐心、细心和严谨。开发人员关注的是需求功能有没有实现,测试人员需要关注的不仅是需求功能有没有实现,还要关注功能实现的质量,包括实现功能的正确性,实现功能的异常处理,性能、安全、兼容性、易用性等方面都要考虑,考虑的方面比较广泛,需要掌控产品的全局。
4、设计支付接口
5、与他人的冲突,怎么解决?
如果是自己的过错就改正,如果是对方的过失就列举出充分的证据证明是对方的过失,劝诫对方发邮件给自己的领导和对方的领导,在邮件中说明事情的起因、经过和结果,是对方过失的充分证据;如果对方死不悔改,就当面找自己的领导和对方的领导以及这件事的相关负责人,把这件事情讲清楚。
6、优化系统延迟
六、便利蜂
1、排名前5的IP
2、数据全量的保存
3、Jenkins的配置
4、排序map中的value
5、开发中遇到的问题,怎么解决?
七、360
1、抓取网页list中的返回的HTTP status
2、sql语句
3、Python写冒泡排序
4、grep命令
八、爱奇艺
一面:
1、介绍项目
hystrix的原理
为什么消息中间件选择kafka
消息中间件的种类,kafka和RabbitMQ的优缺点
RabbitMQ:
RabbitMQ的消息应当尽可能的小,并且只用来处理实时且要高可靠性的消息。
消费者和生产者的能力尽量对等,否则消息堆积会严重影响RabbitMQ的性能。
具有生产者confirm机制以及消费者的消息应答机制ack
Kafka:
kafka强烈的依赖于zookeeper,如果zookeeper挂掉了,那么Kafka也不行了
对消息顺序不依赖,且不是那么实时的系统
Kafka具有巨大的吞吐量,数据的存储以及获取是本地磁盘的批量处理,可以达到百万/s
Kafka不具有应答机制
前置数据采集系统传输消息的量级
怎么处理重复上传的消息
2、链表交叉
3、台阶问题
4、爱奇艺和腾讯的优缺点
爱奇艺画面比腾讯的画面清晰,腾讯的好卡,广告多。
5、最近看过的书,介绍一本
二面:
1、讲项目
2、合并两个有序数组
3、一个函数,str1是str2的子串,返回str1在str2的位置,若str1不是str2的子串返回-1,设计测试用例
边界值
4、25匹马5个跑道,选出最快的3匹
5、自己的优缺点
优点:做事严谨认真有耐心,执行力强不拖拖拉拉,有进取心、喜欢钻研,踏实沉稳、不浮夸
缺点:选择恐惧症,优点优柔寡断,认死理、爱钻牛角尖
6、为什么转测试
1.测试比开发更能了解业务整体架构,了解清楚整体性的业务逻辑,加上了解代码,能够更好地开展测试工作 2.作为女生来说,性格耐心仔细,可以实现重复测试,多次测试,不断测试,对于专而精的开发来说,女生的性格更加适合测试工作。 3.作为测试,虽然入门很容易,但是做好很难,以开发和测试最终的发展之路来说,测试比开发供选择的道路更多,不仅仅可以成为技术方面的全栈工程师,还可以考虑业务专家、行政方面的项目经理等等。
实习的时候做的测试开发,同一个团队的其他业务线的同事忙不过来,让我去帮忙开发测试工具,开发测试工具的过程中,我感觉自己的开发方面写代码能力有待提高,出于想提高自己的开发能力的目的,毕业之后我选择了做开发。想转回测试开发是因为不想在成都待了,想来北京工作,想重新找一份工作,自己做过测试开发,也做过开发,做测试开发和做开发相比,我更喜欢测试开发,想做业务测试、编写测试脚本和开发测试方面的一些工具,不想成天写代码实现业务功能需求。
7、职业规划
从开发转到测试开发,从功能测试做起,整体理解清楚项目的业务架构和业务逻辑,学习自动化测试相关的知识、框架、工具等,自己有一定的代码能力,在理解清楚项目整体架构和业务的基础上结合项目实际需要开发测试工具和自动化测试脚本来提升测试的效率。
我为人谨慎细心有耐心,沟通能力强,善于推动事物,善于发现问题和解决文题,能够胜任测试开发这份工作。近些年来,人们对产品质量和用户体验的要求越来越高,测试开发的发展和前景是非常好的,所以我希望做测试开发。对于远期规划,我会根据环境的变化,工作内容的变化,以及我自身能力的变化,不断进行调整。
近期3到5年之间,我想做测试开发的工作,从业务测试做起,学习自动化测试相关的知识,编写自动化测试的脚本,开发测试工具。我为人谨慎细心有耐心,沟通能力强,代码能力也不错,善于发现问题和解决文件,能够胜任测试开发这份工作。近些年来,人们对产品质量和用户体验的要求越来越高,测试开发的发展和前景是非常好的,所以我希望做测试开发。对于远期规划,我会根据环境的变化,工作内容的变化,以及我自身能力的变化,不断进行调整。
三面:
1、介绍自己,突出技术
2、开发中遇到的问题
3、生活、工作中遇到的难题
4、爱奇艺播放器时而播放时而卡顿,可能是哪里出了问题?
九、百度
一面问题:
1、自我介绍
2、介绍项目
3、AOP:什么是AOP?怎么开启AOP的调试模式
4、什么是POM文件
5、Python:一个dict{A:a,B:b,C:c,D:d,E{fd:er,G:gd},K:k} 找到字符串,打印其key及其父key
6、一个日志文件log,打印合法ip的日志;获取指定时间间隔的日志:存入数据库,long类型
7、什么是springboot
8、Linux命令:cd、ls、find、grep、ps、top、netstat、lsof、touch、chown、chmod、cat、tail、cut、tr、sed、sort、wc、xargs、kill、awk、ifconfig、uniq、du、df
9、springmvc注解:@restcontroller
二面问题:
1、介绍自己
2、你开发的系统和你实习时候的产品的不同
1)、目标用户不同:政府机关单位 VS 广告主
2)、核心价值不同:分析人群属性,计算最佳广告投放人群 VS 对网络安全设备实现风险监测预警,保证网络设备的安全运行
3)、技术架构不同:Hadoop、spark VS 微服务技术
4)、数据量不同:
5)、并发访问量不同:
6)、性能要求不同:
3、连续子数组的最大和
测试v1.0和v2.0版本
4、sed命令:sed 's/good/bad/g' filename
5、实习的时候你的收获是什么?
1)、接触到了最前言的互联网技术,git对代码的管理,大数据的相关知识:spark、Hadoop,Python,shell
2)、知道了百度推送的广告是经过怎样的处理程序呈现在网页上的,DMP、DSP、MDSP、LU
3)、团队合作的重要性,FE、RD、PM、QA相互协调和配合把每一个迭代做好,每个人尽最大努力保证迭代按时上线,并且没有线上问题。
4)、处理事情要讲究方式方法:处理事情的优先级,重要的事情先处理
5)、技术大牛的分享
十、高德地图
1、为什么开发转测试
2、测试百度首页
3、算法
26进制转10进制
合并两个有序数组
合法字符串(全是大写、全是小写、首字母大写其余全小写是合法字符串)
4、什么是restful
RESTful是指资源的表述性状态转移,是一种软件架构的规范和约束。服务端提供的RESTful风格的API中,URL中只能使用名称来指定资源,
原则上不使用动词。URL定位资源的时候用HTTP中的GET、POST、DELETE、PUT等动词描述操作。
5、HTTP状态码
6、知道MongoDB吗
7、用Python做过什么
8、HashMap的底层原理
9、自动化测试
介绍jmeter,postman
10、实习时你做了什么,你在团队中的价值,你的作用
承担了一部分业务测试的工作,保证产品的业务逻辑正确,在产品上线之前发现错误或缺陷,提高产品的用户体验;
编写数据源监控脚本,对产品的数据源进行监控,保证数据的有效供给,如果数据提供方当天真的没有数据产出,就用前一天的数据覆盖一下,保证数据的采集。
帮助团队其他产品线的同事开发脚本自动化的测试工具。
十一、滴滴出行
1、自我介绍
2、画项目架构
3、蛇形矩阵
4、翻转字符串
5、压力测试
怎么判断压力的瓶颈
多线程模拟用户发压
生产者消费者模式
负载测试:是通过逐步增加系统负载,测试系统性能的变化,并在满足最终确定性能指标的情况下,系统所能承受的最大负载量的测试
性能指标:是系统应该满足的,比如请求响应时间等
负载测试是正常范围的测试
压力测试:逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载下系统性能处于失效状态,并以此来获得系统能提供的最大服务级别的测试
6、接口测试
接口测试的注意点
7、awk:一个日志文件(id,ip,time(ms)...),求平均时间和90分位
8、场景题:一台机器上部署了一个或者多个服务(ip:port),一个功能模块通过tcp协议去判断机器上服务的在线和离线,怎么测试
9、为什么测试转开发
我是先找的工作,签完三方然后去实习的。签三方的工作是开发。实习结束的时候,和领导确认没有校招补录名额,自己对开发的工作也不排斥就去做开发了。
10、什么是restful
11、用Python做的什么,MVT,介绍M,用不用自己建数据库
十二、饿了么
一面:
1、泛型
2、反射
3、抢20
4、sql批量插入
INSERT INTO table2 SELECT * FROM table1;
5、数据表的连接:左连接、右连接、内连接、全连接、等值连接
6、Python的列表生成式:生成1-100的平方
7、登录功能设计测试用例
8、输入网址的过程
https://www.jianshu.com/p/c1dfc6caa520
https://www.cnblogs.com/xidian2014/p/8510129.html
二面:
1、自我介绍
2、什么是SQL注入、XSS攻击
3、测试淘宝首页
4、接口设计原则
(1)单一职责原则:接口的职责应该尽量单一
(2)里氏替换原则LSP:子类必须完全实现父类的方法,类可以有自己的个性(属性和方法),覆盖或实现父类的方法时输入参数可以被放大,覆写或实现父类的方法时输出结果可以被缩小。在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
(3)依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。精简的定义:面向接口编程。
测试驱动开发是依赖倒置原则的最好体现。测试驱动开发要求先写测试类,测试通过才写实现类,这就要求你要先想接口定义。
(4)接口隔离原则:建立单一接口,不要建立臃肿庞大的接口。接口尽量细化,同时接口中的方法尽量少。
(5)迪米特法则,又称最少知识原则:一个类应该对自己需要耦合或调用的类知道得最少。高内聚、低耦合。
(6)开闭原则:对扩展开放,对修改关闭
5、黑盒测试的方法
6、数据库表的设计原则