Atom飞行手册翻译: 3.8 编写spec

编写 spec

我们已经通过一些例子查看并编写了一些spec,现在是更进一步查看spec框架本身的时候了。确切地说,你在Atom中如何编写测试呢?

Atom使用Jasmine作为spec框架。任何新的功能都要拥有specs来防止回归。

创建新的 spec

Atom的spec包的spec都要添加到它们各自的spec目录中。下面的例子为Atom核心创建了一个spec。

创建spec文件

spec文件必须以-spec结尾,所以把sample-spec.coffee添加到atom/spec中。

添加一个或多个describe方法

describe方法有两个参数,一个描述和一个函数。以when开始的描述通常会解释一个行为;而以方法名称开头的描述更像一个单元测试。

describe "when a test is written", ->
  # contents

或者

describe "Editor::moveUp", ->
  # contents

添加一个或多个it方法

it方法也有两个参数,一个描述和一个函数。尝试去让it方法长于描述。例如,this should work的描述并不如it this should work便于阅读。但是should work的描述要好于it should work

describe "when a test is written", ->
  it "has some expectations that should pass", ->
    # Expectations

添加一个或多个预期

了解预期(expectation)的最好方法是阅读Jasmine的文档。下面是个简单的例子。

describe "when a test is written", ->
  it "has some expectations that should pass", ->
    expect("apples").toEqual("apples")
    expect("oranges").not.toEqual("apples")

异步的spec

编写异步的spec刚开始会需要些技巧。下面是一些例子。

Promise

在Atom中处理Promise更加简单。你可以使用我们的waitsForPromise函数。

  describe "when we open a file", ->
    it "should be opened in an editor", ->
      waitsForPromise ->
        atom.workspace.open('c.coffee').then (editor) ->
          expect(editor.getPath()).toContain 'c.coffee'

这个方法可以在describeitbeforeEachafterEach中使用。

describe "when we open a file", ->
  beforeEach ->
    waitsForPromise ->
      atom.workspace.open 'c.coffee'

  it "should be opened in an editor", ->
    expect(atom.workspace.getActiveTextEditor().getPath()).toContain 'c.coffee'

如果你需要等待多个promise,对每个promise使用一个新的waitsForPromise函数。(注意:如果不用beforeEach这个例子会失败)

describe "waiting for the packages to load", ->

  beforeEach ->
    waitsForPromise ->
      atom.workspace.open('sample.js')
    waitsForPromise ->
      atom.packages.activatePackage('tabs')
    waitsForPromise ->
      atom.packages.activatePackage('tree-view')

  it 'should have waited long enough', ->
    expect(atom.packages.isPackageActive('tabs')).toBe true
    expect(atom.packages.isPackageActive('tree-view')).toBe true

带有回调的异步函数

异步函数的Spec可以waitsForruns函数来完成。例如:

describe "fs.readdir(path, cb)", ->
  it "is async", ->
    spy = jasmine.createSpy('fs.readdirSpy')

    fs.readdir('/tmp/example', spy)
    waitsFor ->
      spy.callCount > 0
    runs ->
      exp = [null, ['example.coffee']]
      expect(spy.mostRecentCall.args).toEqual exp
      expect(spy).toHaveBeenCalledWith(null, ['example.coffee'])

访问Jasmine文档)来了解更多关于异步测试的细节。

运行 spec

大多数情况你会想要通过触发window:run-package-specs来运行spec。这个命令不仅仅运行包的spec,还运行了Atom的核心spec。它会运行当前项目spec目录中的所有spec。如果你想要运行Atom的核心spec和所有默认包的spec,触发window:run-all-specs命令。

要想运行spec的一个有限的子集,使用fdescribefit方法。你可以使用它们来聚焦于单个或者几个spec。在上面的例子中,像这样聚焦于一个独立的spec:

describe "when a test is written", ->
  fit "has some expectations that should pass", ->
    expect("apples").toEqual("apples")
    expect("oranges").not.toEqual("apples")

在CI中运行

在CI环境,类似Travis和AppVeyor中运行spec现在非常容易。详见文章“Travis CI For Your Packages”和“AppVeyor CI For Your Packages”。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值