Klayout和Phidl的回归检验

lytest的Python项目详细描述


[![构建状态](https://travis-ci.org/atait/lytest.svg?branch=master)(https://travis ci.org/atait/lytest)
[![DOI](https://zenodo.org/badge/144975054.svg)(https://zenodo.org/badge/latestdoi/144975054)

决定它的行为需要运行它。这种行为是我们想要的吗?有三个基本问题:

1。代码是否运行
2。其行为是否正确
3。如果它的行为发生了变化,那么理想情况下,我们希望在任何代码变化之后,所有这些问题都能在一系列测试中得到精确的回答。但代码不断变化。pytest是一个自动化的单元测试框架,它很好地解决了这个问题。在一个命令中,它滚动一堆测试函数,确保它们运行,并对行为进行一些程序员定义的检查。




很难用文字说明正确的行为是什么,所以布局必须通过眼睛来检查。即使是一个复杂的布局,这个过程也需要花费大量的时间;它只需要审阅者的眼睛和知识就可以完成;而且实际上,如果没有自上次审阅(来自多个协作者)以来的数百次提交,就无法完成,这使得定位错误的来源变得非常困难。



###lytest所做的
"lytest"通过完全自动化布局审阅过程的一个关键部分:更改检测来解决布局行为测试问题。它结合了"pytest"自动测试框架和"klayout"异或差异引擎。如果存储的gds引用文件被认为是正确的,那么更改检测就如同回答正确性问题一样好。

测试由生成gdsii(或oasis)文件的固定代码块组成。初始运行将生成引用布局。经过人工检查后,该文件将被标记为该代码块的"正确"行为。执行测试时,块再次运行,生成新的"运行"gds。几何结构的差异(即非空异或)将引起进行测试的人的注意。




安装依赖于pytest、klayout和lygadgets——它们通过pip自动作为依赖项安装。



与"pytest"类似。

``python
def test\u addition():
assert 1+1==2
```

`lytest有两个神奇的部分使xor测试变得简单:布局容器,如"contained\u xxx"和xor test decorator:"difftest"。这里有一个完整的测试文件,我们在其中测试来自myphidlibrary(phidl语言版本)的"波导管"设备。
``python
来自lytest import contained phidl device,difftest
将myphiu库导入为lib
@contained phidldevice
def basicwaveguides(top):
top.add\reference(lib.波导管(宽度=0.5,长度=20))

def test_basicwaveguides():difftest_it(basicwaveguides)()
`````

"包含"函数(basicwaveguides)不是pytest函数。它接受(空)单元格,修改该单元格,但不返回任何内容。允许使用可选参数。它们不能以"test"开头或以"test"结尾。下面讨论的声明和调试包含的布局有点神奇。现在,按照这种方式来考虑它。

pytest函数(`test_basicwaveguides`)本质上只是对'difftest_it`的重命名,它包装了包含的几何函数。difftest实现了测试布局、异或测试和错误报告的编译。所有这些第二个函数都具有完全相同的格式,这就是为什么它们是作为一行程序编写的。如果你想用pytest禁用一个自动运行的测试,只需注释掉第二个函数即可。

第一个是正常的ish函数。它可以被调用,检查,用来保存到文件。它不仅仅是一个测试(见下文)。第二个是自动运行,并有一大堆其他的事情发生,比如xor测试本身。检查角落的箱子。可能有意使用"pytest.raises"来中断它。
``python
def basicwaveguides(top):
top.添加参考(lib.波导(width=0.5,length=20))
wg2=lib.波导(width=0.5,length=50)
top.添加参考(wg2.旋转(90))
with pytest.raises(valueerror):
wg3=lib.波导(width=-0.5,length=50)
```

第一次运行新测试时,它会将结果放在ref_布局中,并在其中进行修复。如果该代码更改并且您再次运行测试,则会产生几何差异错误。因此,如果您认为新行为是正确的,请更新引用。这是从命令行:
``bash
lytest store test_geometries.py basicwaveguides
```
将"test_geometries.py"替换为文件名,并将"basicwaveguides"替换为您的任何名称。

它们是经常更改的大型二进制文件,这对于版本控制方案来说是一个糟糕的组合。oasis格式的内存效率更高。它从v0.0.4开始就受支持,可以在"difftest_it"调用中选择(请参见klayout示例)。



如果目标是一个目录,它将自动遍历以"test"开头或以"test"结尾的.py文件。在文件中,pytest自动调用以"test"开头或以"test"结尾的每个函数。如果引发异常,它将打印堆栈跟踪,但继续执行下一个函数。

SS控件,但它本质上是一个可视化调试工具。` lytest和lyipc的设计目的是一起提供更多的视觉信息。在开发过程中,包含的几何图形结果会自动发送到gui。在测试期间,在gui中为xor准备失败的测试。通过klayout salt package manager获取它

每次对任何分支进行推送时,都会将该分支拉入虚拟机(位于travis ci.org),并运行预定义的测试套件。几分钟后,github将显示该分支是否正在传递。lytest有ci,如何设置ci的示例可以在"travis.yml"中找到。由于klayout standalone需要很长时间才能构建,因此建议打开pip的缓存选项。



gds和oasis是二进制格式,因此它们无法通过典型的文本差异进行有意义的比较。这确实是版本控制方法的一个问题,因为它们依赖于跨提交、暂存区域和分支的扩散。` lytest有效地提供了一种区分布局的方法,因此它可以提供帮助。它只会弹出klayout中的两个文件,所以需要激活'lyipc'服务器。这很酷,相信我。

o配置您自己的git系统来启用它。这只需通过
``bash
lytest git config
```
您也可以使用`--local`标记逐个项目地完成这项工作。

``bash
git diff feature branch tests/ref-layouts/
````
来查看所有的差异都转到klayout gui.

lytest/lyipc/ipython测试驱动的工作流
我目前在开发新的设备单元时使用此工作流(与系统级单元相反-另一个工作流)。它是测试驱动设计的图形布局版本。它是由lytest中的一些工具启用的。

每当您编写一个新函数时,您都可以使用各种选项调用它,以便开发它并了解它的作用。你想出了一个你喜欢的图书馆行为和usgage电话的混合体。如果你把这些电话保存在正确的地方,你就做了一个测试!

设置失败的xor测试,以便可以可视化xor结果

[pdb](https://docs.python.org/3/library/pdb.html)(python调试器)
-基于终端,尽可能轻量级
-使用"import pdb;pdb.set_trace()`
-可以调用quickplot或kqp(`klayout_quickplot`)从中
-推荐:[pdb++](https://pypi.org/project/pdbpp/)


ipython(交互式python)
-升级的命令行shell
-关闭与更改代码的交互,自动转载
-通过设置
`` python
print('autoreload is on')
%在`~/.ipython/profile_default/startup/auto_reloader.ipy`

%autoreload 2
``
在把你的目标写在纸上之后,开始制作一个容器函数,它有一些基本的行为,从lytest import contained phidldevice,difftest it,将我的库作为lib导入;lib.qubit()

klayout gui中的pc服务器。打开一个ipython外壳(打开autoreload)。向库函数添加一些行为。为了了解它的作用,
``python
[1]%load\u ext autoreload
[2]%autoreload 2
[3]from test\u qubits import somequbits
[4]somequbits()
```
voila。包含的布局已显示在Klayout图形用户界面中。

更改库行为。再次调用它
``python
[3]somequbits()
```
voila!出现"新"行为。没有重新加载所有的开销或处理布局样板。每次保存库时都可以重复此调用。

保留那些。你可能会得到
``python
test廑qubits.py

@包含的廑phidldevice
def somequbits(top):
top<;<;lib.qubit()
top<;<;lib.qubit(detuing=100e6)。movey(100)
top<;<;lib.qubit(local廑reatic=true)。movex(100)

```ally,当你对库的行为感到满意时,把它变成一个自动运行的测试,告诉你的所有合作者-嘿,不要改变任何最终会破坏"somequbits"容器的东西。要执行此操作,只需取消对上面具有difftest的行的注释即可。


布局"容器"的外观与内部不同。从外面,它是一个函数。它有一个可选参数,即文件名。调用时,它会生成布局并将其保存到该文件中。从外部来看,容器不是特定于语言的。调用方不知道是否正在使用phidl、pya或其他几何语言。

有时该布局会保存到一个文件中,否则将被发送以进行快速打印或在异或测试中使用。关键的是,无论我们想如何使用,容器内部的几何代码都保持相同。

它似乎接收的不是文件名而是python objecs:cell(pya)或device(phidl)。因此,容器也是一个包装器,负责将几何命令转换为完整布局时的设置和拆卸。脚本容器不是pya或phidl特定的。它们包含生成文件的任意代码,并且必须返回要由容器找到的文件名。



ES、Jeff Shainline、Rich Mirin、Sae Woo Nam、美国博尔德国家标准与技术研究所

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Google Billing Library:QueryPurchaseAsync:取消购买的订阅资源未返回   java转换列表mapsturct中的单个对象   java简单算法。我做不好   包含集合的@ManyToMany映射的java JPA2持久性   在Java中序列化和反序列化对象时发生BuffereImage错误   java使用ui:param传递值并在backingbean中访问它们   java从应用程序读取配置。yml至POJO列表地图   java中在while循环外部调用文件值   java如何与来自不同类的UI交互   java如何在jTable中显示2D数组?   在Java 8中,类为什么不从接口继承默认方法?   java类。getAnnotation和getAnnotations无法正常工作   java处理pagertabstrip上的触摸事件   java GWT和struts2异常   用Java解析HTTP查询字符串   java这段代码SQL注入安全吗?