求职 面试又失败了

MmoMartin · 2020年11月26日 · 最后由 昊男 回复于 2021年03月16日 · 662 次阅读

       我面试测试开发岗位,都失败了,找了快 3 个月了吧。试过阿里的好几个部门,基本 2 面就 OVER 了,百度的还好,能挺进第三面,不过还是挂了,腾讯最惨,第一面就 O 了,字节也是第一面就 O 了,哎,挺难的。每次失败都在总结经验。最近一次面试的是阿里的第二面,说起这面,挺惨的,挂的自己都觉得不应该。
       这次阿里的第二面尽然是代码题,这是第一次遇到的,之前的所有的面试都是在最后的时间出代码题的,这次尽然单独拎出来,直接撸代码。

题目:给定一个时间,如 20200601,算出这个时间是今年的第几天。以下开始我的表演!!!!!

       看到这道题的时候,我脑海了出现了一句:糟了,python 的时间模块不熟悉啊,字符串时间跟时间戳的转化不知道用啥函数啊,未战先怯了,硬着头皮,皮拉皮拉敲了的好几个函数,判断闰年平年,判定格式,敲了一会儿,面试官看了,说了一句:被你这么敲,太久了,python 不是有函数功能吗,你可以用 python 的功能函数做出来。我回了一句:嗯,应该有的。我把之气的函数注释了,开始沉思了下,确定了思路,开始撸码。将大体思路写下来,注释下下来,(截区前面 4 个字符,算出 20200101 的时间戳,再算出当天的时间戳,再用当前的时间戳 - 当年 1 月 1 号的时间戳的差除以 24 小时的秒数,得出时间),嗯这个思路我觉得可行,就编写对应的函数了:如下

# -*- coding: utf-8 -*-
import datetime


# 输出函数
def get_year_count(temp_day):
    _localtime = formart_str(temp_day)
    # 获取当年1月 1号的时间戳
    year_date = temp_day[:4] + "-01-01 00:00:00"
    day_first = formart_str(year_date)
    print(day_first)
    # 获取天数
    print(_localtime - day_first)
    day_counts = (_localtime - day_first) / 3600  /  24  + 1 
    return day_counts


# 获取输入日期的时间戳
def formart_str(tmp_day):
    try:
        # 算出当前时间的时间戳
        timestamp = datetime.datetime.strptime(tmp_day, '%Y-%m-%d %H:%M:%S')
        timestamp = datetime.datetime.timestamp(timestamp)
        return timestamp
    except Exception as e:
        return e

这个是我面试后写的,目前还是有问题的,不知你们有么有看出来。。。。。。。。。。。

       开始的时候我的代码是有问题的,第一处:formart_str 的算出当前的时间戳使用的函数有问题的,写错了,当时确实不知道函数之间的转换,但是现在知道了,也是这次面试让我熟悉了 datetime 模块的 3 个常用函数strptimestrftimetimestamp。第二处:get_year_count 函数算出结果没有 +1,day_counts 计算的差值()【(_localtime - day_first) / 3600 / 24 + 1 ,这部分少了()】。

面试官问:你现在对你写的函数测试下。
我想现在开始考察测试能力。我写了个 main 函数,写测试用例:以入口进行测试。

面后,才发现面试官是想考察我的功能测试能力审查代码能力以及单元测试的能力啊啊啊啊。很可惜,这次我确实搞砸了,临时断片了。就写了等价类划分:

输入正常的值如 get_year_count(“20200205”),判断输出值是否正确

输入异常值:空,null,” 20200266“,,判断输出值是否正确

面试官看了我写的测试点后,说:你现在把的代码 copy 到你的编辑器,看有没有问题。

我就 copy 过去了,运行了下,数据类型错误,就说了类型的错误。哈确实不应该,若当时我能明确指出我当前的代码问题就好了。比如:

1. formart_str 函数抛出异常的时候,对 get_year_count 函数的执行会是一个致命点,符串与整形的算术运算会报错,终止该函数。
2. 没有对输入数据的格式进行校验:首先是长度,第二是数据格式中每一位都是数字,第三是整形的数据格式
3. 就是对结果值得校验了
4. 对该函数得功能准备的测试用例不够,如边界值的划分【20190229,20201131】,边界值被成为特殊等价类;错误推测法;根据前面的异常等价类进行编写其他的测试用例:如缺失位数,位数有其他类型的数据等,至于安全,性能,从这个说的话就有点远了,我觉得从能把等价类划分清楚就很不错了,不知大家是否认同。

       至于单元测试,从我这块的代码中,没有条件,没有判定,只有语句,不过有个 try-----except。还有一个点是在我面试时遇到的,若碰到不熟悉的函数我觉得完全可以想网上查下,当然需先询问下面试官下意见是否可以这么做先。

       面试真不容易啊,跟考试很像,答卷 100,看你能拿多少分,自我评分及格吧,有很大的进步空间,很遗憾的说我尽然败在这简单题目上,有点可惜了。当然也积累了我的面试经验,加油!!!!!!继续找,加油!!!一道题可以看出一个测试的水平,字如其人,我们时码如其人

共收到 22 条回复 时间 点赞

你这搞这么复杂,基础是不是不太行?api 调用惯了?
最后 4 位各取两位,写个月 case,判断下闰年,加一下不就 ok 了?
最多分析一下是不是全数字。。。
为什么要记函数呢?当然我可能理解也有问题。下次不要猜别人意图,觉得有问题,直接问好了。

import datetime


def get_n_day(date_str: str):
    """
    >>> get_n_day('20200101')
    1

    >>> get_n_day('20200102')
    2

    >>> get_n_day('20201231')
    366

    >>> get_n_day('20211127')
    '日期不在今年之内'

    >>> get_n_day('20181127') == '日期不在今年之内'
    True

    >>> err_msg = "输入日期格式错误,正确格式如:20201127"
    >>> get_n_day('2020-11-27') == err_msg
    True

    >>> get_n_day('202011270') == err_msg
    True

    >>> get_n_day(20200101) == err_msg
    True

    >>> get_n_day("") == err_msg
    True
    """
    try:
        end_day = datetime.datetime.strptime(date_str, '%Y%m%d')
    except Exception as e:
        return "输入日期格式错误,正确格式是:20201127"

    begin_day = datetime.datetime.today().replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
    n_day = (end_day - begin_day).days + 1

    if n_day < 0 or n_day > 366:
        return "日期不在今年之内"
    return n_day

if __name__ == '__main__':
    import doctest

    doctest.testmod(verbose=True)


import time
a = '20200201'
b = a[:4]+'0101'
c = (int(time.mktime(time.strptime(a, '%Y%m%d'))) - int(time.mktime(time.strptime(b, '%Y%m%d'))))//(60*60*24)+1
print(c)

这个题不是很难!
面试也是讲究天时、地利、人和;
前两个靠自己平时的积累,第三个也是最关键的,很多时候靠运气!
好运!!!

我觉得可以用伪代码捋下实现逻辑,用惯了 ide 再去手写真是不会,函数也没必要去记吧

建议多练习,多写代码。

面试一般由于紧张大多只能发挥 80% 功力,如果本身不够熟练很容易一下子懵逼。平时多练,多刷刷题,还是有好处的。

如果对代码有兴趣,推荐 CS61A、CS61B。
理解什么是编码,理解什么是数据结构。

magicyang 回复

写这个函数是有用的,函数可以帮我们自动校验日期格式是否正确如是否越界了,会提示我们

难是不难,但是面试测试开发,题目做出来后,需要怎么测试。按功能:该如何写测试用例;按单元:如何测试用例;还有评审代码时需要测试的代码审查能力,我觉得这才是重点

其实"糟了,python 的时间模块不熟悉啊,字符串时间跟时间戳的转化不知道用啥函数啊"这段就暴露问题了,datetime 应该算测开最常接触的模块之一。能见面试官说明楼主简历过得去,多撸点代码吧,不要浪费面试机会。

感觉这个题,如果能用内置函数,主要还是想看看基础和熟练度吧,碰上刚好不熟悉的只能说运气不好,time.strptime() 第几周,第几天,周几,等等基本都能用这个解决。

import time
input_str = '20200601'
t = time.strptime(input_str, '%Y%m%d')
print(time.strftime('%j',t))

老铁需不需要内推快手试下~~

没事,多面面就好了,类似这种面试很多,都是实现功能后,单元测试里的用例划分好写全;尤其是用例设计是主要考察点,当然前提是得实现;

仅楼主可见
except Exception as e:
    return e

这 python 代码真是让人一言难尽

大佬 测试开发都需要什么能力啊,啥要求 能讲一下吗 我小白

magicyang 回复

我在开发过程中,基本都是函数,函数复用比较方便

shensong 回复

我这个面试过了 就是百度地图的 ,第三轮 OVER,谢谢

MmoMartin 回复

好吧。我也不知道测试编程考啥。
反正我的 C++ 面试都是会被面试官怀疑,正在恶补中。。。

嘎哈 回复

哈 目前找到一份大数据的开发,先做一段时间先

花菜 回复

cool

想到用 unix 时间戳减法,但是裸写真的不记得方法。 就慢慢码了

DAYS_IN_MONTH = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def is_leap(year):
    return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

def days_in_month(year, month):
    assert 1 <= month <= 12, month
    if month == 2 and is_leap(year):
        return 29
    return _DAYS_IN_MONTH[month]

def _days(date):
    years=int(date[:4])
    month=int(date[4:6])
    days=int(date[6:])
    print(days,month)
    if month>1:
        for i in range(1,month):
            days=days + days_in_month(years,i)
    return days

print(_days('20200201'))
def math_days(goal_date: str) -> int:
    if isinstance(goal_date, str) and len(goal_date) == 8:
        goal_year = goal_date[:4]
        now_year = datetime.date.today().year
        if int(now_year) > int(goal_year):
            print('输入日期异常: 不能输入过期年份')
            return -1
        try:
            end = datetime.datetime.strptime(goal_date, '%Y%m%d')
            start = datetime.datetime.strptime(str(now_year) + '0101', '%Y%m%d')
            return (end-start).days + 1

        except ValueError:
            print('输入的时间格式非"年月日"')
            return -1

        except Exception as e:
            print(e.__class__.__name__, e)
            return -1
    else:
        print('输入的时间格式错误')
        return -1
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册