0

放弃后端,冲测开去了!

 6 months ago
source link: https://www.51cto.com/article/783285.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

放弃后端,冲测开去了!

作者:小林coding 2024-03-08 17:37:47
关系型数据库存储结构化数据。这些数据逻辑上以行列二维表的形式存在,每一列代表数据的一种属性,每一行代表一个数据实体。

大家好,我是小林。

最近有一些同学看到很多大厂都开了春招实习,但是自己准备的比较晚,比较着急,问我有什么快速突击的办法?

如果之前基础薄弱的情况下,突击 1-2 个月也比较难进大厂的后端的,因为有些底层知识原理,得花时间慢慢啃,不然一问三不知,就寄了。

不过可以另辟蹊径,不卷后端,尝试一下测试开发的岗位。

测开的面试相比后端简单很多,而且投的人不算多,没有后端卷,获得面试机会的概率更高一些。

在互联网大厂的校招中,测试开发的薪资实际上和后端开的是一样的,比如普通档的大厂 offer,都是 22k*16(年薪 35w+)。

测试开发岗会伴随开发+测试类的工作,开发主要是开发一些测试工具来提高测试效率,也会和根据业务团队的需求开发一些工具。

测试开发的面试其实跟后端开发差不多,其实被问的问题不会太细节或者太底层,除此后端的内容之外,还会考察一些测试相关的内容。

比如,如何设计测试用例、黑盒测试和白盒测试有什么区别、手动测试和自动测试有什么区别、api 测试工具怎么用等等。

甚至也会问,为什么要选择做测试开发等之类的问题, 同学们在投递测开岗位的时候,最好提前准备下测试相关的问题。

今天分享2位同学大厂测开的校招面试:快手和滴滴的测开面经。

虽然也会有算法题,但是整体的八股和算法的难度确实会比后端减少了很多,是一个弯道超车进大厂的机会,给想准备测开同学做一个参考。

快手测开实习

数据库增删改查指令说一下?

增加(Insert):用于向数据库表中插入新的数据记录。

  • SQL语句示例:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);

删除(Delete):用于从数据库表中删除符合指定条件的数据记录。

  • SQL语句示例:DELETE FROM table_name WHERE condition;

修改(Update):用于更新数据库表中符合指定条件的数据记录。

  • SQL语句示例:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

查询(Select):用于从数据库表中检索数据记录。

  • SQL语句示例:SELECT column1, column2, ... FROM table_name WHERE condition;

mysql和redis的区别?

数据存储方式:

  • MySQL:数据以表格的形式以行和列的方式存储在磁盘上,支持复杂的关系型数据模型。
  • Redis:数据存储在内存中,因此具有更快的读写速度,但受到内存容量的限制。

数据类型:

  • MySQL:支持各种数据类型,包括整型、浮点型、字符型、日期型等。
  • Redis:支持丰富的数据类型,如字符串、列表、集合、哈希表、有序集合等,适合用于缓存、消息队列等场景。
  • MySQL:支持持久化存储数据,数据可以在磁盘上持久保存。
  • Redis:可以选择是否持久化数据,支持RDB快照和AOF日志两种持久化方式。

应用场景:

  • MySQL:适用于需要复杂查询和事务支持的应用,如企业级应用、电子商务平台等。
  • Redis:适用于对速度要求较高、数据量较小、对数据结构要求较高的场景,如缓存、计数器、实时排行榜等。

http和https的区别?

  • HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
  • HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  • 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
  • HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

https的安全性体现在哪里?

  • 数据加密:HTTPS使用SSL/TLS加密协议对数据进行加密传输,防止数据在传输过程中被窃听或篡改。
  • 身份验证:HTTPS使用SSL证书对服务器进行身份验证,确保通信双方的身份,防止中间人攻击。
  • 数据完整性:HTTPS使用消息摘要算法(如SHA)来验证数据的完整性,确保数据在传输过程中没有被篡改。

tcp的可靠性怎么保障的?

TCP协议主要通过以下几点来保证传输可靠性:连接管理、序列号、确认应答、超时重传、流量控制、拥塞控制。

  • 连接管理:即三次握手和四次挥手。连接管理机制能够建立起可靠的连接,这是保证传输可靠性的前提。
  • 序列号:TCP将每个字节的数据都进行了编号,这就是序列号。序列号的具体作用如下:能够保证可靠性,既能防止数据丢失,又能避免数据重复。能够保证有序性,按照序列号顺序进行数据包还原。能够提高效率,基于序列号可实现多次发送,一次确认。
  • 确认应答:接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况。在指定时间后,若发送端仍未收到确认应答,就会启动超时重传。
  • 超时重传:超时重传主要有两种场景:数据包丢失:在指定时间后,若发送端仍未收到确认应答,就会启动超时重传,向接收端重新发送数据包。确认包丢失:当接收端收到重复数据(通过序列号进行识别)时将其丢弃,并重新回传ACK报文。
  • 流量控制:接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,就会导致接收端的缓冲区溢出,进而导致丢包。为了避免上述情况的发生,TCP支持根据接收端的处理能力,来决定发送端的发送速度。这就是流量控制。流量控制是通过在TCP报文段首部维护一个滑动窗口来实现的。
  • 拥塞控制:拥塞控制就是当网络拥堵严重时,发送端减少数据发送。拥塞控制是通过发送端维护一个拥塞窗口来实现的。可以得出,发送端的发送速度,受限于滑动窗口和拥塞窗口中的最小值。拥塞控制方法分为:慢开始,拥塞避免、快重传和快恢复。

linux指令简单说几个

  • ls:列出目录内容。
  • grep:在文件中搜索指定模式。
  • chmod:修改文件权限。
  • top:显示系统当前资源占用情况。
  • ps:显示当前进程信息。
  • netstate:查看进程端口号

数组和链表的区别?

  • 访问效率:数组可以通过索引直接访问任何位置的元素,访问效率高,时间复杂度为O(1),而链表需要从头节点开始遍历到目标位置,访问效率较低,时间复杂度为O(n)。
  • 插入和删除操作效率:数组插入和删除操作可能需要移动其他元素,时间复杂度为O(n),而链表只需要修改指针指向,时间复杂度为O(1)。
  • 缓存命中率:由于数组元素在内存中连续存储,可以提高CPU缓存的命中率,而链表节点不连续存储,可能导致CPU缓存的命中率较低,频繁的缓存失效会影响性能。
  • 应用场景:数组适合静态大小、频繁访问元素的场景,而链表适合动态大小、频繁插入、删除操作的场景

设计测试用例:朋友圈点赞功能

测试用例1 - 点赞功能正常使用:

  • 步骤:用户进入朋友圈页面,找到一条动态,点击点赞按钮。
  • 预期结果:点赞按钮状态变为已点赞,点赞数加一,用户信息显示在点赞列表中。

测试用例2 - 取消点赞功能:

  • 步骤:用户进入朋友圈页面,找到已点赞的动态,再次点击点赞按钮。
  • 预期结果:点赞按钮状态变为未点赞,点赞数减一,用户信息从点赞列表中移除。

测试用例3 - 多用户同时点赞:

  • 步骤:多个用户同时对同一条动态进行点赞操作。
  • 预期结果:点赞数正确累加,点赞列表显示所有点赞用户信息。

测试用例4 - 点赞数上限限制:

  • 步骤:连续多次点赞同一条动态。
  • 预期结果:点赞数达到上限时,无法再进行点赞操作,系统给出相应提示。

测试用例5 - 点赞数据同步:

  • 步骤:用户在多端(如手机、电脑)对同一条动态进行点赞操作。
  • 预期结果:点赞操作在所有设备上同步更新,保持一致性。

测试用例6 - 点赞功能异常处理:

  • 步骤:模拟网络异常或服务器故障时进行点赞操作。
  • 预期结果:系统能够正确处理异常情况,保证数据的一致性和完整性。

手撕:链表删除

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

public class LinkedListDeletion {
    public ListNode deleteNode(ListNode head, int val) {
        if (head == null) {
            return null;
        }
        
        if (head.val == val) {
            return head.next;
        }
        
        ListNode prev = head;
        ListNode curr = head.next;
        
        while (curr != null) {
            if (curr.val == val) {
                prev.next = curr.next;
                break;
            }
            prev = curr;
            curr = curr.next;
        }
        
        return head;
    }
}
  • 为什么选择测试开发岗位?

滴滴测开面经

介绍TCP和UDP,有什么应用?

  • TCP:TCP是面向连接的、可靠的、基于字节流的传输协议,适用于需要可靠传输、顺序传输、流量控制和拥塞控制的应用。
  • UDP:UDP是无连接的、不可靠的、基于数据包的传输协议。适用于实时性要求高、能容忍一定数据丢失的应用,以及需要减少通信开销的应用。

你了解redis吗?

了解,redis属于NoSQL数据库的一种,它主要用来作为缓存、分布式锁、消息中间件等多种用途。

数据存储在内存中,读写速度非常快,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。

关系型数据库的特点是什么?

SQL数据库,指关系型数据库 - 主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源)。

关系型数据库存储结构化数据。这些数据逻辑上以行列二维表的形式存在,每一列代表数据的一种属性,每一行代表一个数据实体。

图片

图片

NoSQL指非关系型数据库 ,主要代表:MongoDB,Redis。NoSQL 数据库逻辑上提供了不同于二维表的存储方式,存储方式可以是JSON文档、哈希表或者其他方式。

图片

图片

选择 SQL vs NoSQL,考虑以下因素。

ACID vs BASE

关系型数据库支持 ACID 即原子性,一致性,隔离性和持续性。相对而言,NoSQL 采用更宽松的模型 BASE , 即基本可用,软状态和最终一致性。

从实用的角度出发,我们需要考虑对于面对的应用场景,ACID 是否是必须的。比如银行应用就必须保证 ACID,否则一笔钱可能被使用两次;又比如社交软件不必保证 ACID,因为一条状态的更新对于所有用户读取先后时间有数秒不同并不影响使用。

对于需要保证 ACID 的应用,我们可以优先考虑 SQL。反之则可以优先考虑 NoSQL。

扩展性对比

NoSQL数据之间无关系,这样就非常容易扩展,也无形之间,在架构的层面上带来了可扩展的能力。比如 redis 自带主从复制模式、哨兵模式、切片集群模式。

相反关系型数据库的数据之间存在关联性,水平扩展较难 ,需要解决跨服务器 JOIN,分布式事务等问题。

你的登录接口设计的哪些测试用例?

  • 边界值测试:测试输入的边界情况,例如最小长度的用户名和密码、最大长度的用户名和密码等。
  • 状态转换测试:测试在不同状态下进行登录操作的情况,如已登录状态下再次登录应有何反应。
  • 权限测试:测试不同用户角色的登录情况,如管理员、普通用户等。
  • 并发测试:模拟多个用户同时尝试登录系统,验证系统的并发处理能力。
  • 跨平台测试:测试不同平台(如PC、移动端)上的登录功能。
  • 性能测试:验证系统在不同负载下的登录性能,如高并发情况下的登录响应时间。
  • 安全性测试:测试系统对于安全漏洞(如密码泄露、会话劫持)的防范能力。

手撕:sql语句:有一张成绩表,查询最高成绩

SELECT MAX(score) FROM grades;

手撕:二分查找

public int binarySearch(int[] arr, int target) {
    int low = 0;
    int high = arr.length - 1;

    while (low <= high) {
        int mid = low + (high - low) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return -1; // target not found
}
  • 介绍研究研究方向
  • 为什么想做测试?

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK