英文:
Travis-CI GoLang Examples test error
问题
似乎找不到这个问题的答案。
我正在尝试使用Travis-CI来构建/运行我的GoLang包的测试,但是Travis在运行作为测试一部分的GoLang示例时失败。
例如,这是一个示例:
func Example() {
now := time.Date(2017, time.February, 1, 7, 51, 0, 0, time.Local)
// instantiate a new Podcast
p := podcast.New(
"Sample Podcasts",
"http://example.com/",
"An example Podcast",
&now, &now,
)
// add some channel properties
p.ISubtitle = "A simple Podcast"
p.AddImage("http://example.com/podcast.jpg")
p.AddAuthor("Jane Doe", "jane.doe@example.com")
for i := int64(0); i < 2; i++ {
n := strconv.FormatInt(i, 10)
// create an Item
item := podcast.Item{
Title: "Episode " + n,
Description: "Description for Episode " + n,
ISubtitle: "A simple episode " + n,
PubDate: &now,
}
// add a Download to the Item
item.AddEnclosure("http://example.com/"+n+".mp3", podcast.MP3, 55*(i+1))
// add the Item and check for validation errors
if _, err := p.AddItem(item); err != nil {
os.Stderr.WriteString("item validation error: " + err.Error())
}
}
// Podcast.Encode writes to an io.Writer
if err := p.Encode(os.Stdout); err != nil {
os.Stderr.WriteString("error writing to stdout: " + err.Error())
}
// Output:
// <?xml version="1.0" encoding="UTF-8"?>
// <rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
// <channel>
// <title>Sample Podcasts</title>
// <link>http://example.com/</link>
// <description>An example Podcast</description>
// <generator>go podcast v1.0.0 (github.com/eduncan911/podcast)</generator>
// <language>en-us</language>
// <lastBuildDate>Wed, 01 Feb 2017 07:51:00 -0500</lastBuildDate>
// <managingEditor>jane.doe@example.com (Jane Doe)</managingEditor>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <image>
// <url>http://example.com/podcast.jpg</url>
// </image>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple Podcast</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <item>
// <guid>http://example.com/0.mp3</guid>
// <title>Episode 0</title>
// <link>http://example.com/0.mp3</link>
// <description>Description for Episode 0</description>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <enclosure url="http://example.com/0.mp3" length="55" type="audio/mpeg"></enclosure>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple episode 0</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <itunes:duration>55</itunes:duration>
// </item>
// <item>
// <guid>http://example.com/1.mp3</guid>
// <title>Episode 1</title>
// <link>http://example.com/1.mp3</link>
// <description>Description for Episode 1</description>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <enclosure url="http://example.com/1.mp3" length="110" type="audio/mpeg"></enclosure>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple episode 1</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <itunes:duration>110</itunes:duration>
// </item>
// </channel>
// </rss>
}
这是一个失败的Travis构建的链接,go test
失败,尽管在本地运行正常:
https://travis-ci.org/eduncan911/podcast/builds/198093154
$ go test -covermode count -coverprofile cover.out
--- FAIL: Example (0.00s)
got:
<?xml version="1.0" encoding="UTF-8"?>
...(省略)
want:
<?xml version="1.0" encoding="UTF-8"?>
...(省略)
go test
命令在本地的macOS、Windows 10虚拟机和EC2 Ubuntu实例上正常工作。
只有Travis无法运行带有示例的go test
。
如果跳过示例,则测试通过:
$ go test -run Test -covermode count -coverprofile cover.out
但这就失去了以下目的:
- 验证示例
- 将代码覆盖率报告从97%降至43%
(是的,我将示例用作代码覆盖率的一部分-我正在尝试撰写的博文的一部分,并使用Travis来展示它。但是,糟糕!Travis出错了!)
我怀疑Travis在stderr
和/或stdout
上做了一些奇怪的事情,将输出重定向到控制台/日志,这可能会阻止go test
看到结果。
英文:
Can't seem to find an answer to this one.
I am trying to use Travis-CI to build/run tests for my GoLang package; but, Travis keeps failing on GoLang Examples that are running as part of the tests.
For example, here's one Example:
func Example() {
now := time.Date(2017, time.February, 1, 7, 51, 0, 0, time.Local)
// instantiate a new Podcast
p := podcast.New(
"Sample Podcasts",
"http://example.com/",
"An example Podcast",
&now, &now,
)
// add some channel properties
p.ISubtitle = "A simple Podcast"
p.AddImage("http://example.com/podcast.jpg")
p.AddAuthor("Jane Doe", "jane.doe@example.com")
for i := int64(0); i < 2; i++ {
n := strconv.FormatInt(i, 10)
// create an Item
item := podcast.Item{
Title: "Episode " + n,
Description: "Description for Episode " + n,
ISubtitle: "A simple episode " + n,
PubDate: &now,
}
// add a Download to the Item
item.AddEnclosure("http://example.com/"+n+".mp3", podcast.MP3, 55*(i+1))
// add the Item and check for validation errors
if _, err := p.AddItem(item); err != nil {
os.Stderr.WriteString("item validation error: " + err.Error())
}
}
// Podcast.Encode writes to an io.Writer
if err := p.Encode(os.Stdout); err != nil {
os.Stderr.WriteString("error writing to stdout: " + err.Error())
}
// Output:
// <?xml version="1.0" encoding="UTF-8"?>
// <rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
// <channel>
// <title>Sample Podcasts</title>
// <link>http://example.com/</link>
// <description>An example Podcast</description>
// <generator>go podcast v1.0.0 (github.com/eduncan911/podcast)</generator>
// <language>en-us</language>
// <lastBuildDate>Wed, 01 Feb 2017 07:51:00 -0500</lastBuildDate>
// <managingEditor>jane.doe@example.com (Jane Doe)</managingEditor>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <image>
// <url>http://example.com/podcast.jpg</url>
// </image>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple Podcast</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <item>
// <guid>http://example.com/0.mp3</guid>
// <title>Episode 0</title>
// <link>http://example.com/0.mp3</link>
// <description>Description for Episode 0</description>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <enclosure url="http://example.com/0.mp3" length="55" type="audio/mpeg"></enclosure>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple episode 0</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <itunes:duration>55</itunes:duration>
// </item>
// <item>
// <guid>http://example.com/1.mp3</guid>
// <title>Episode 1</title>
// <link>http://example.com/1.mp3</link>
// <description>Description for Episode 1</description>
// <pubDate>Wed, 01 Feb 2017 07:51:00 -0500</pubDate>
// <enclosure url="http://example.com/1.mp3" length="110" type="audio/mpeg"></enclosure>
// <itunes:author>jane.doe@example.com (Jane Doe)</itunes:author>
// <itunes:subtitle>A simple episode 1</itunes:subtitle>
// <itunes:image href="http://example.com/podcast.jpg"></itunes:image>
// <itunes:duration>110</itunes:duration>
// </item>
// </channel>
// </rss>
}
Here's a link to a specific Travis build that fails go test
, even though it runs locally:
https://travis-ci.org/eduncan911/podcast/builds/198093154
$ go test -covermode count -coverprofile cover.out
--- FAIL: Example (0.00s)
got:
<?xml version="1.0" encoding="UTF-8"?>
...(omitted)
want:
<?xml version="1.0" encoding="UTF-8"?>
...(omitted)
go test
command works normally locally on macOS, in a Windows 10 VM and in an EC2 Ubuntu instances.
It is only Travis that is not able to to run go test
, with examples.
If I skip the Examples, then the tests pass with:
$ go test -run Test -covermode count -coverprofile cover.out
But that defeats the purpose of:
- Validating the Examples
- Drops code-coverage report from 97% down to 43%
(yes, I use Examples as part of code coverage - part of a blog post I am trying to write, and to use Travis to show it. but, uh, oops! travis errors!)
I suspect Travis is doing something funky with stderr
and/or stdout
, redirecting the output to the console/log which may prevent go test
from seeing the results.
答案1
得分: 3
在Travis上,got和want的值并不相同。它们之间的差异在于时区偏移。
在你的本地机器上,time.Local
是 -0500,而在Travis上是 +0000。使用time.UTC
或其他与代码运行的系统无关的位置:
now := time.Date(2017, time.February, 1, 7, 51, 0, 0, time.UTC)
英文:
The got and want values on Travis are not identical. They differ by the time zone offset.
time.Local
is -0500 on your local machine and +0000 on Travis. Use time.UTC
or some other location that's independent of the system where the code is running running:
now := time.Date(2017, time.February, 1, 7, 51, 0, 0, time.UTC)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论